json_keys()返回null的常见原因包括输入非json对象(如数组、字符串、数字或null),且仅支持顶层键提取;需先用json_type()确认类型为object,并配合json_table()展开键名。

JSON_KEYS函数返回NULL的常见原因
直接对非对象类型的JSON值调用JSON_KEYS()会返回NULL,比如传入JSON数组、字符串、数字或NULL本身。MySQL严格要求输入必须是JSON对象(即花括号包裹的键值对结构)。
- 错误示例:
JSON_KEYS('["a","b"]')→NULL(输入是数组) - 错误示例:
JSON_KEYS('"name"')→NULL(输入是字符串,不是合法JSON对象) - 正确前提:先用
JSON_TYPE()确认字段类型,如SELECT JSON_TYPE(data) FROM t WHERE id = 1,确保结果为OBJECT - 若字段可能为空或类型混杂,建议加
WHERE JSON_VALID(data) AND JSON_TYPE(data) = 'OBJECT'过滤
从JSON字段提取所有键名的基本写法
JSON_KEYS()只接受一个JSON文档参数,返回一个包含键名的JSON数组(如["id", "name", "tags"])。它不支持路径表达式,也不能直接展开成多行——这是新手最常误解的一点。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 基础用法:
SELECT JSON_KEYS(data) FROM users WHERE id = 101 - 若想把键名单独列出为多行,必须配合
JSON_TABLE()(MySQL 8.0.4+):SELECT jt.key_name FROM users, JSON_TABLE(JSON_KEYS(data), '$[*]' COLUMNS (key_name TEXT PATH '$')) AS jt WHERE id = 101
- 注意:
JSON_KEYS()不保证键名顺序,MySQL官方不承诺返回顺序与原始JSON一致
处理嵌套JSON对象时的限制
JSON_KEYS()只作用于顶层对象,无法递归提取子对象中的键。例如{"user": {"name": "Alice", "age": 30}},JSON_KEYS()只返回["user"],不会深入user内部。
- 要获取嵌套键,需先用
JSON_EXTRACT()定位子对象:JSON_KEYS(JSON_EXTRACT(data, '$.user')) - 如果嵌套层级不确定或动态,
JSON_KEYS()本身无解,需结合应用层解析或存储过程递归处理 - 性能提示:多次嵌套
JSON_EXTRACT()+JSON_KEYS()会产生额外JSON解析开销,高频查询建议预计算并存入辅助字段
兼容性与替代方案(MySQL
MySQL 5.7 不支持JSON_KEYS(),且没有内置等效函数。强行迁移旧版本时不能只改函数名。
- 5.7中唯一可行的“模拟”方式是:用
JSON_EXTRACT()逐个尝试已知键名,再用IFNULL()拼接判断逻辑——但这要求你预先知道可能的键集合,本质不可扩展 - 更现实的做法是:在应用层读取JSON后解析键名(Python用
.keys(),Node.js用Object.keys()),避免在数据库内硬扛 - 升级到MySQL 8.0+是根本解法;若无法升级,考虑将JSON结构扁平化为关系表,用标准
SELECT COLUMN_NAME查元数据
JSON_KEYS()对输入类型的零容忍——它不像JSON_EXTRACT()那样能静默失败或返回空数组,而是直接返回NULL,且没有任何警告。务必在WHERE条件里做类型校验,否则查询结果会莫名缺失。










