json_extract路径须以$开头,键名含特殊字符需用双引号包裹;返回值为json类型,可用->>操作符去引号;大表查询应建生成列+索引优化性能。

JSON_EXTRACT 语法和路径表达式怎么写才不报错
直接用 JSON_EXTRACT 查嵌套字段时,最常遇到 NULL 返回或 Invalid JSON path expression 错误——根本原因是路径写法不对。MySQL 的 JSON 路径必须以 $ 开头,且键名含特殊字符(如短横线、空格)或为数字开头时,必须用双引号包裹。
比如字段 data 存的是:{"user-info": {"id": 123, "tags": ["admin", "vip"]}},想取 tags 数组:
SELECT JSON_EXTRACT(data, '$."user-info".tags') FROM t;
漏掉引号会解析失败;写成 $.user-info.tags 也会报错。数组索引从 0 开始,取第一个 tag: $.user-info.tags[0];通配所有元素用 $.user-info.tags[*]。
查出来的结果带引号?怎么去掉
JSON_EXTRACT 总是返回 JSON 类型值,字符串会被包上双引号,数字可能带小数点(如 123.0),这在 WHERE 或 JOIN 里容易出问题。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 用
JSON_UNQUOTE(JSON_EXTRACT(...))去掉外层引号,适用于字符串字段 - 更推荐直接用
->>操作符,它是JSON_UNQUOTE(JSON_EXTRACT(...))的语法糖,写起来更干净:data->>"$.user-info.id" - 数值类字段如果后续要计算,建议再套一层
CAST(... AS UNSIGNED)或CAST(... AS SIGNED),避免隐式转换异常
WHERE 条件里用 JSON_EXTRACT 效率低怎么办
在大表上对 JSON 字段反复调用 JSON_EXTRACT 做过滤,基本等于全表扫描——JSON 字段无法走普通索引。真正可行的优化只有两个方向:
- 建生成列(Generated Column)+ 普通索引:例如
ALTER TABLE t ADD COLUMN user_id INT AS (data->>"$.user-info.id") STORED,再给user_id加索引 - MySQL 5.7+ 支持对 JSON 字段建函数索引(需虚拟列):必须用
STORED列,VIRTUAL列不能建索引 - 别试图用
JSON_CONTAINS替代JSON_EXTRACT做等值判断——它查的是子文档包含关系,不是精确匹配,语义不同
处理多层嵌套和动态 key 的边界情况
当 JSON 结构不固定(比如 {"results": [{"code": "A", "val": 1}, {"code": "B", "val": 2}]}),想按 code = "A" 找对应 val,JSON_EXTRACT 本身不支持条件遍历。这时得组合使用:
先用 JSON_LENGTH(data->"$.results") 知道数组长度,再配合 JSON_EXTRACT(data->"$.results", CONCAT('$[', n, '].code')) 手动循环(适合少量数据);生产环境更稳妥的做法是把这类结构拆到关联表,JSON 只存真正动态、不可预知的元数据。
另外注意:JSON 路径中不能拼接变量,CONCAT 构造的路径字符串在 JSON_EXTRACT 里不会被解析为路径,只能用于生成列定义或预处理逻辑中。










