MySQL从5.7版本开始支持JSON数据类型及函数,可高效操作JSON数据,适用于配置、标签等半结构化场景。以下是具体操作方法:
1. 插入和存储JSON数据- 使用JSON类型建表:确保字段存储合法JSON格式。CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, info JSON);
- 直接插入JSON字符串:INSERT INTO users (info) VALUES ('{"name": "Alice", "age": 25, "hobbies": ["reading", "swimming"]}'),('{"name": "Bob", "age": 30, "hobbies": ["gaming"]}');
- 使用JSON_OBJECT()构造JSON对象:INSERT INTO users (info) VALUES (JSON_OBJECT("name", "Charlie", "age", 35));
2. 查询JSON字段内容- ->操作符:返回带引号的JSON值(保留格式)。SELECT info->"$.name" AS name FROM users;-- 输出:"Alice"
- ->>操作符:返回去引号后的实际值(常用于比较或条件查询)。SELECT info->>"$.name" AS name FROM users;-- 输出:Alice
- 查询数组元素(如第一个爱好):SELECT info->>"$.hobbies[0]" AS hobby FROM users;
3. 修改JSON数据- JSON_SET():设置或更新指定路径的值(存在则改,不存在则增)。UPDATE users SET info = JSON_SET(info, "$.city", "Beijing") WHERE info->>"$.name" = "Alice";
- JSON_REPLACE():仅替换已有路径的值(不存在则不操作)。UPDATE users SET info = JSON_REPLACE(info, "$.age", 26) WHERE info->>"$.name" = "Alice";
- JSON_INSERT():仅插入新值(路径存在则忽略)。UPDATE users SET info = JSON_INSERT(info, "$.gender", "female") WHERE info->>"$.name" = "Bob";
4. 删除JSON字段或元素- JSON_REMOVE():删除指定路径的字段或元素。UPDATE users SET info = JSON_REMOVE(info, "$.city") WHERE id = 1;
5. 构造和格式化JSON- JSON_ARRAY():创建JSON数组。SELECT JSON_ARRAY("reading", "swimming") AS hobbies;
- JSON_QUOTE():将字符串转为带引号的JSON字符串。SELECT JSON_QUOTE('hello') AS quoted_string;
- JSON_PRETTY():美化输出JSON结构(便于查看)。SELECT JSON_PRETTY(info) FROM users WHERE id = 1;
6. 条件查询与索引优化- 生成列加索引:提升JSON字段查询性能。-- 添加生成列(虚拟列)ALTER TABLE users ADD COLUMN name VARCHAR(50) GENERATED ALWAYS AS (info->>"$.name");-- 创建索引CREATE INDEX idx_name ON users(name);效果:按名字查询时,索引会加速条件过滤(如WHERE name = 'Alice')。
适用场景与注意事项通过合理使用MySQL的JSON函数,可以灵活处理非结构化或半结构化数据,同时保持关系型数据库的核心优势。