json_extract提取数组首元素需用'$[0]'路径,若返回null应先验证json合法性及类型;多元素提取推荐一次调用多路径参数,动态展开数组宜用json_table。

JSON_EXTRACT 提取数组第一个元素失败?检查路径语法是否带方括号
MySQL 的 JSON_EXTRACT 对 JSON 数组索引的写法很严格:必须用 $[0],不能写成 $[1](那是第二个)或 $.0(语法错误)。路径字符串里数字必须包在方括号中,且从 0 开始计数。
常见错误现象:JSON_EXTRACT(json_col, '$.tags[0]') 返回 NULL,但数据明明有值——大概率是 json_col 本身不是合法 JSON,或路径指向了不存在的键/索引。
- 先用
JSON_VALID(json_col)确认字段内容可解析 - 用
JSON_TYPE(json_col)检查顶层类型,确保是ARRAY或含数组的OBJECT - 路径中对象键名和数组索引可混用,如
'$.data.items[2].name'
提取多个数组元素时,别用多个 JSON_EXTRACT 调用
要取前三个标签,写三遍 JSON_EXTRACT(col, '$[0]')、JSON_EXTRACT(col, '$[1]')、JSON_EXTRACT(col, '$[2]') 不仅啰嗦,还重复解析 JSON 字符串,性能差。更直接的方式是用 JSON_EXTRACT(col, '$[0]', '$[1]', '$[2]') —— 它支持多路径参数,一次解析、多次提取,返回一个包含结果的 JSON 数组。
- 返回值仍是 JSON 类型(比如
["a","b","c"]),如需字符串需再套JSON_UNQUOTE() - 若某索引越界(如数组只有两个元素却取
$[5]),对应位置返回NULL,不会报错 - MySQL 8.0.24+ 支持该多路径用法;低版本只能单次单路径调用
想把 JSON 数组转成行集?JSON_TABLE 是更干净的解法
当目标是“把 ["apple","banana","cherry"] 拆成三行”,JSON_EXTRACT 只能静态取固定下标,无法动态展开。这时应切换到 JSON_TABLE —— 它专为这种场景设计,类似虚拟表。
示例:
SELECT jt.fruit FROM orders, JSON_TABLE(items, '$[*]' COLUMNS (fruit TEXT PATH '$')) AS jt;
说明:
-
'$[*]'表示遍历数组所有元素 -
COLUMNS (fruit TEXT PATH '$')将每个元素映射为列fruit,类型为TEXT - 相比反复用
JSON_EXTRACT+UNION ALL模拟,JSON_TABLE更可读、可维护,且支持 WHERE 过滤和 JOIN
JSON_EXTRACT 返回带引号的字符串?记得用 JSON_UNQUOTE 去壳
JSON_EXTRACT 总是返回 JSON 类型值,哪怕提取的是字符串字面量,结果也是带双引号的 JSON 字符串(如 "hello"),直接用于比较或拼接会出问题。例如 WHERE JSON_EXTRACT(data, '$[0]') = 'admin' 永远为假,因为左边是 "admin",右边是字符串 admin。
- 正确写法:
JSON_UNQUOTE(JSON_EXTRACT(data, '$[0]')) = 'admin' - 或者用快捷函数
JSON_VALUE(data, '$[0]')(MySQL 8.0.22+),它等价于JSON_UNQUOTE(JSON_EXTRACT(...)) - 注意
JSON_UNQUOTE(NULL)仍返回NULL,无需额外判空
NULL。动手前先 SELECT json_col, JSON_TYPE(json_col), JSON_VALID(json_col) FROM ... LIMIT 1 看一眼,省去大半排查时间。











