MySQL中JSON数据类型怎么用_有哪些常用操作技巧?

絕刀狂花
发布: 2025-07-16 09:10:02
原创
1170人浏览过

mysql从5.7开始支持json数据类型,适用于存储配置、标签等半结构化数据。1. 创建表时定义json列;2. 插入合法json字符串;3. 使用->或->>提取字段内容;4. 用json_extract或->操作符做条件筛选;5. 用json_contains查询数组中的值;6. 更新整个或部分json内容可用json_set、json_replace或json_remove函数;7. 对json字段建索引推荐使用虚拟列加索引或mysql 8.0+的json索引方式;json虽灵活但应合理设计,结合常规字段使用效果更佳。

MySQL中JSON数据类型怎么用_有哪些常用操作技巧?

MySQL从5.7版本开始支持JSON数据类型,这让它在处理半结构化数据时更加灵活。如果你需要存储类似配置、标签、嵌套信息等不固定格式的数据,用JSON字段会比传统的多表关联更方便。但怎么用得顺手,还是有些技巧的。

MySQL中JSON数据类型怎么用_有哪些常用操作技巧?

JSON字段的基本使用方式

创建表的时候,可以直接定义一个列的类型为JSON

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    info JSON
);
登录后复制

插入数据时,直接传入合法的JSON字符串即可:

MySQL中JSON数据类型怎么用_有哪些常用操作技巧?
INSERT INTO users (info) VALUES ('{"name": "张三", "age": 28, "tags": ["开发", "阅读"]}');
登录后复制

查询的时候,可以用->操作符提取字段内容:

SELECT info->'$.name' AS name FROM users;
登录后复制

注意:这个提取出来的结果是带引号的字符串,如果要去掉引号,可以加个->>

MySQL中JSON数据类型怎么用_有哪些常用操作技巧?
SELECT info->>'$.name' AS name FROM users;
登录后复制

查询JSON中的特定值

有时候你可能想根据JSON里的某个字段做条件筛选,比如找出所有年龄大于30的用户:

SELECT * FROM users WHERE JSON_EXTRACT(info, '$.age') > 30;
登录后复制

或者用更简洁的写法:

SELECT * FROM users WHERE info->'$.age' > 30;
登录后复制

如果你要查数组类型的字段,比如找tags里包含“开发”的记录:

SELECT * FROM users WHERE JSON_CONTAINS(info->'$.tags', '"开发"');
登录后复制

注意里面的值要用双引号包裹,因为JSON标准要求字符串必须用双引号。

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online

修改JSON字段的内容

更新整个JSON内容很简单,直接赋新值就行:

UPDATE users SET info = '{"name": "李四", "age": 32}' WHERE id = 1;
登录后复制

但如果只想修改其中某个字段,推荐用JSON_SETJSON_REPLACEJSON_REMOVE函数:

  • JSON_SET:添加或更新字段
  • JSON_REPLACE:只替换已有字段
  • JSON_REMOVE:删除字段

举个例子,给id=1的用户增加一个地址字段:

UPDATE users SET info = JSON_SET(info, '$.address', '北京') WHERE id = 1;
登录后复制

索引优化JSON查询性能(重点)

默认情况下,对JSON字段内的值做查询是不能走索引的,效率会比较低。解决办法有两个:

  • 创建虚拟列(Generated Column)并为其建立索引
  • 使用JSON索引(MySQL 8.0+ 支持)

以虚拟列为例子:

ALTER TABLE users ADD COLUMN name VARCHAR(100) GENERATED ALWAYS AS (info->>'$.name') STORED;
CREATE INDEX idx_name ON users(name);
登录后复制

这样以后按名字查询就能走索引了。

如果是MySQL 8.0以上版本,还可以直接建索引:

CREATE INDEX idx_age ON users((CAST(info->'$.age' AS UNSIGNED)));
登录后复制

不过这种写法稍显复杂,也容易出错,建议优先考虑虚拟列的方式。


基本上就这些。JSON类型虽然好用,但别滥用,尤其不要把整个表都设计成一个大JSON字段。适当结合常规字段和JSON结构,才能发挥最大优势。

以上就是MySQL中JSON数据类型怎么用_有哪些常用操作技巧?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号