一、查询
-- 查询字段类型为JSON的字段user
SELECT user FROM person; -- {"name": "john", "age": 21}
-- 查询字段user的name属性
SELECT user->'$.name' FROM person; -- "john"
-- 查询字段user的name属性
SELECT user->>'$.name' FROM person; -- john
-- 查询字段user的age属性
SELECT JSON_EXTRACT(user, '$.age') FROM person; -- 21
二、修改
-- 修改user的name为"tina"
UPDATE person SET user = JSON_SET(user, '$.name', 'tina');
-- 查询字段user的name属性
SELECT user->'$.name' FROM person; -- "tina"
三、索引
可通过在虚拟列上建索引来实现
-- 新建虚拟列name_virtual
ALTER TABLE person ADD COLUMN name_virtual VARCHAR(10) AS (user->>'$.name');
-- 给虚拟列建索引
ALTER TABLE person ADD INDEX idx_name_virtual (name_virtual);
四、附
Tips
- 自MySQL 5.7.8之后开始支持JSON处理
- JSON类型字段存储空间大小约等于LONGTEXT
JSON语法
https://dev.mysql.com/doc/refman/5.7/en/json-functions.html