能转,但必须严格匹配json结构、路径写法和列定义规则;写错任意一环就报错,不是返回空结果,而是直接中断查询。error 3143因路径语法错误(如漏引号、多点号),error 3149因路径合法但数据不存在或类型不匹配;需先验json_valid,再用json_extract探查结构,路径须加单引号且层级对齐。

JSON_TABLE 报 ERROR 3143 或 3149 怎么快速定位?
这两个错误最常见,本质都是路径表达式不合法或不匹配数据实际结构:
-
ERROR 3143 (42000):路径语法错——漏单引号(如写$.id而非'$.id')、用了双斜杠//、多写了点号(如'$.[*]') -
ERROR 3149 (HY000):路径合法但数据里真没这东西——比如源 JSON 是{"user": {"name": "Alice"}},却写路径'$.users[*]'(字段名拼错),或试图从字符串值上取子对象("tags": "a,b,c"却用'$.tags[*]')
实操建议:先用 SELECT JSON_VALID(your_json_col) 确认 JSON 合法;再用 SELECT JSON_EXTRACT(your_json_col, '$') 看原始结构;最后把路径粘贴进 JSON_TABLE 前加单引号、确保层级对齐。
处理 JSON 数组时为什么只出一行?
因为路径写成了 '$' 而不是 '$[*]'。MySQL 把整个数组当一个 JSON 值对待,JSON_TABLE 只生成一行,所有列都尝试从数组对象本身取值(结果基本是 NULL)。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 正确写法:
JSON_TABLE(data, '$[*]' COLUMNS (name VARCHAR(50) PATH '$.name')) - 错误写法:
JSON_TABLE(data, '$' COLUMNS (name VARCHAR(50) PATH '$[*].name'))——$[*]不能出现在子路径里 - 注意空数组:
[]返回 0 行;[null]返回 1 行,所有列是NULL;[{}]则按类型填默认值(INT→0,VARCHAR→'')
嵌套数组(如订单+商品)怎么写才不出错?
不能在一个 COLUMNS 里硬写多层路径,必须用 NESTED PATH 分层。否则字段取不到,或行数不对。
- 错误示例(只有一层
COLUMNS):JSON_TABLE(o.data, '$' COLUMNS (order_id INT PATH '$.id', item_id INT PATH '$.items[*].id'))——$.items[*].id不被允许 - 正确写法:
JSON_TABLE(o.data, '$' COLUMNS (order_id INT PATH '$.id', NESTED PATH '$.items[*]' COLUMNS (item_id INT PATH '$.id'))) - 关键点:
NESTED PATH必须嵌在最外层COLUMNS内;其内部的PATH中的$指向当前数组元素(即{"id": 101}),不是原始 JSON 根节点 - 行数膨胀:1 个订单含 3 个商品 → 输出 3 行,每行带相同
order_id和对应item_id
ON EMPTY 和 ON ERROR 为什么不是可选?
生产环境 JSON 字段缺失、类型错乱太常见。不显式声明,行为不可控:字段不存在时可能返回 NULL,也可能报错中断,取决于 MySQL 版本和配置。
- 必须写全:
name VARCHAR(50) PATH '$.name' DEFAULT 'unknown' ON EMPTY DEFAULT 'error' ON ERROR -
DEFAULT后只能跟字面量或 JSON 字符串(如DEFAULT '"N/A"'),不能是变量或函数 -
ON ERROR设为ERROR会在类型转换失败时炸掉整个查询;设为DEFAULT才能兜底 - 别信“默认就是 NULL”——不同版本表现不一致,显式写死才可靠
真正容易被忽略的是:路径本身越界(比如写 '$.items[99].id' 但数组只有 3 个元素)也会触发 ON EMPTY,不是静默忽略。










