JSON_TABLE路径错误直接报ERROR 3143或3149,必须严格匹配结构:根数组用'$[*]',对象内数组须用NESTED PATH;嵌套需分层定义,PATH为相对路径;空值和异常必须显式配置ON EMPTY/ON ERROR。

路径写错直接报ERROR 3143或3149,不是返回空
JSON_TABLE不接受模糊匹配,路径表达式必须严格合法且与实际JSON结构一致。常见错误包括:$.[*](多了一个点)、'$/*'(用错符号)、'$.items[0].id'(越界索引)——这些都会触发ERROR 3143 (42000): Invalid path expression或ERROR 3149 (HY000): The JSON path is not valid for the given JSON document。
根级是数组时必须用'$[*]';根级是对象(如{"order_id": 1, "items": [...]})时主路径只能是'$',再用NESTED PATH '$.items[*]'展开子数组。
嵌套数组必须用NESTED PATH,不能靠多层PATH硬写
想同时取顶层字段和子数组元素,不能在一个COLUMNS里混写路径。比如源数据是{"order_id": 101, "items": [{"sku": "A", "qty": 2}, {"sku": "B", "qty": 1}]},错误写法:COLUMNS(order_id INT PATH '$.order_id', sku VARCHAR(20) PATH '$.items[*].sku')——$.items[*].sku在非根级上下文中不被允许,结果为空或报错。
正确做法是:COLUMNS(order_id INT PATH '$.order_id', NESTED PATH '$.items[*]' COLUMNS(sku VARCHAR(20) PATH '$.sku', qty INT PATH '$.qty'))。注意:NESTED PATH必须嵌套在最外层COLUMNS内,且其内部所有PATH都以当前数组元素为根(即$指向{"sku": "A", "qty": 2})。
ON EMPTY和ON ERROR必须显式声明,别信默认行为
生产环境JSON字段常缺失或类型错乱,比如"price": "99.99"(字符串)却定义为DECIMAL PATH '$.price',不加ON ERROR可能返回NULL或直接报错,行为不可控。
建议统一显式配置:price DECIMAL(10,2) PATH '$.price' ON EMPTY DEFAULT 0.00 ON ERROR DEFAULT 0.00。对布尔、日期等敏感类型更要如此——created_at DATE PATH '$.created_at' ON EMPTY NULL ON ERROR NULL比依赖隐式转换更安全。
性能关键:路径越具体,解析越快
JSON_TABLE的解析开销随路径复杂度线性增长。用'$[*]'遍历整个数组没问题,但若只需提取$.items[0].sku,就别写'$.items[*]'再加WHERE jt.item_index = 1——前者扫描全部元素,后者仍要构造完整虚拟表。
真实优化点:
• 避免通配符如'$**.id'(MySQL 8.0不支持)
• 对高频查询字段,提前用STORED生成列+索引,例如:ALTER TABLE orders ADD COLUMN first_sku VARCHAR(20) AS (JSON_UNQUOTE(JSON_EXTRACT(items, '$[0].sku'))) STORED


















