mysql 8.0 简化 json 查询的核心是新增 -> 和 ->> 操作符:-> 等价 json_extract,->> 等价 json_unquote(json_extract(...)),支持通配符、多路径、函数索引及严格模式校验。

MySQL 8.0 的 JSON_EXTRACT 本身没简化,真正简化的是用法——你几乎不用再写它了。
用 ->> 替代 JSON_EXTRACT + JSON_UNQUOTE
5.7 里取字符串值必须套两层函数:JSON_UNQUOTE(JSON_EXTRACT(data, '$.name'));8.0 直接用 data->>'$.name',语义清晰、少出错、少打字。
-
->等价于JSON_EXTRACT,返回带引号的 JSON 类型值(如"admin") -
->>等价于JSON_UNQUOTE(JSON_EXTRACT(...)),直接返回去引号后的原生类型(如admin) - 在
WHERE或ORDER BY中混用->和->>容易因类型隐式转换导致意外不匹配,尤其涉及大小写或空格时 - 注意:
->>对NULL输入返回NULL,和JSON_UNQUOTE(NULL)行为一致,安全
路径表达式支持更灵活的写法
8.0 支持数组通配符($[*].id)、多路径($."key with space"),而 5.7 解析失败或静默返回 NULL。
- 含空格或特殊字符的 key 必须用双引号包裹:
data->>'$.user."full name"',写成$.user.full name会提取失败 - 数组通配符
[*]在 8.0 中可被优化短路,5.7 遇到就退化为全量解析,性能断崖式下降 - 路径中不能用变量拼接(如
CONCAT('$.', @key)),MySQL 不支持动态路径;若真需动态,得用预处理语句,而非函数内联
配合生成列时语法更简洁、索引更直接
5.7 必须显式定义 STORED 列并手动建索引;8.0 仍需 STORED,但支持函数索引,可跳过生成列直接加速查询。
- 8.0 允许:
CREATE INDEX idx_status ON t((JSON_UNQUOTE(data->>'$.status')));—— 括号里是表达式,不是字段名 - 5.7 不支持该语法,报错
ERROR 3752 (HY000): Generated column cannot be stored or indexed - 即便用了函数索引,路径若含通配符(如
$.tags[*].id)仍无法索引,因为结果非单值;这种场景只能靠JSON_TABLE展开 - 别忽略字符集影响:
utf8mb4_0900_as_cs(8.0 默认)大小写敏感,->>'$.Name'不会匹配"name": "admin";测试时建议统一加COLLATE utf8mb4_bin
真正容易被忽略的不是语法变化,而是行为差异:8.0 默认开启 innodb_strict_mode,JSON 校验前置,写入略慢但读取更稳定;5.7 松散模式下校验延迟,可能让坏数据漏过,后期查 JSON_EXTRACT 返回 NULL 才发现字段根本无效。











