MySQL中SELECT提取JSON数据触发#3143错误的原因解析
MySQL JSON_EXTRACT动态路径触发#3143错误的原因及解决
问题重现
现有两张表,尝试通过主表person的ref字段值,从副表person_details的JSON类型字段details中提取对应数据:
create table person ( id int(8), ref varchar(20), primary key (id) ); create table person_details ( id int(8), details json, primary key (id) ); -- 执行此SQL触发错误 SELECT JSON_EXTRACT(details, CONCAT('$.', p.ref)) FROM person p JOIN person_details d using (id);
错误信息:
#3143 - Invalid JSON path expression. The error is around character position 12.
错误原因
核心问题是动态拼接的JSON路径不符合MySQL的JSON路径语法规范:
- 若
person.ref字段的值包含特殊字符(如空格、连字符-、点号.、括号等),直接拼接成$.xxx格式的路径会被判定无效——JSON键名若不是合法标识符(仅含字母、数字、下划线且不以数字开头),必须用双引号包裹。 - 即便
ref的值是合法标识符,MySQL对JSON路径的语法校验在解析阶段进行,动态拼接的字符串可能无法被正确识别为合法路径。
解决方法
修改路径拼接逻辑,将动态键名用双引号包裹,确保路径符合语法要求:
SELECT JSON_EXTRACT(details, CONCAT('$."', p.ref, '"')) FROM person p JOIN person_details d using (id);
也可以使用更简洁的->>运算符实现相同效果:
SELECT details->>CONCAT('$."', p.ref, '"') FROM person p JOIN person_details d using (id);
内容的提问来源于stack exchange,提问作者membersound
相关产品推荐
相关产品推荐

