MySQL 5.7的原生JSON数据类型使用

MySQL 5.7的原生JSON数据类型使用

大家好,又见面了,我是全栈君。

新增测试用表:

CREATE TABLE lnmp (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `category` JSON,
    `tags` JSON,
    PRIMARY KEY (`id`)
);

新增数据

INSERT INTO `lnmp` (category, tags) VALUES ('{"id": 1, "name": "lnmp.cn"}', '[1, 2, 3]');

INSERT INTO `lnmp` (category, tags) VALUES (JSON_OBJECT("id", 2, "name", "php.net"), JSON_ARRAY(1, 3, 5));

分别是两种不同的方式新增

查询:

显示json格式内部字段:

SELECT id, category->'$.id', category->'$.name', tags->'$[0]', tags->'$[2]' FROM lnmp;

去除掉默认双引号:

SELECT id, category->'$.name', JSON_UNQUOTE(category->'$.name'), category->>'$.name' FROM lnmp;

 

条件查询:

SELECT * FROM lnmp WHERE category = CAST('{"id": 1, "name": "lnmp.cn"}' as JSON);

必须使用cast转换为json类型

如果不转换就相当于查询String,是查询不到数据的。

使用json内属性进行条件查询:

SELECT * FROM lnmp WHERE category->'$.name' = 'lnmp.cn';

SELECT * FROM lnmp WHERE category->>'$.name' = 'lnmp.cn';

两种皆可

要特别注意的是,JSON 中的元素搜索是严格区分变量类型的,比如说整型和字符串是严格区分的

SELECT * FROM lnmp WHERE category->'$.id' = 1;

除了用 column->path 的形式搜索,还可以用JSON_CONTAINS 函数,但和 column->path 的形式有点相反的是,JSON_CONTAINS 第二个参数是不接受整数的,无论 json 元素是整型还是字符串,否则会出现这个错误

SELECT * FROM lnmp WHERE JSON_CONTAINS(category, '1', '$.id');

对于数组类型的 JSON 的查询,比如说 tags 中包含有 2 的数据,同样要用 JSON_CONTAINS 函数,同样第二个参数也需要是字符串

SELECT * FROM lnmp WHERE JSON_CONTAINS(tags, '2');

更新JSON:

UPDATE lnmp SET tags = '[1, 3, 4]' WHERE id = 1;

但如果要更新 JSON 下的元素,MySQL 并不支持 column->path 的形式

则可能要用到以下几个函数

JSON_INSERT() 插入新值,但不会覆盖已经存在的值

UPDATE lnmp SET category = JSON_INSERT(category, '$.name', 'lnmp', '$.url', 'www.lnmp.cn') WHERE id = 1;

可以看到 name 没有被修改,但新元素 url 已经添加进去

JSON_SET() 插入新值,并覆盖已经存在的值

UPDATE lnmp SET category = JSON_SET(category, '$.host', 'www.lnmp.cn', '$.url', 'http://www.lnmp.cn') WHERE id = 1;

可以看到 host 已经插入,url 已经被修改

JSON_REPLACE() 只替换存在的值

UPDATE lnmp SET category = JSON_REPLACE(category, '$.name', 'php', '$.url', 'http://www.php.net') WHERE id = 2;

可以看到 name 已经被替换,url 不存在被忽略。

JSON_REMOVE() 删除 JSON 元素

UPDATE lnmp SET category = JSON_REMOVE(category, '$.url', '$.host') WHERE id = 1;

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111614.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mac如何查看已连接wifi的密码「建议收藏」

    mac如何查看已连接wifi的密码「建议收藏」可以通道mac自带的“钥匙串访问”功能查看。选择需要查询的wifi名称,右击选择“将密码拷贝到剪贴板”,输入管理员密码后,密码就拷贝好了。找个地方粘贴即可看到密码

    2022年8月4日
    12
  • python怎么安装pymysql_python pymysql安装「建议收藏」

    python怎么安装pymysql_python pymysql安装「建议收藏」==================mysql.connector===================最近发现mysql5.7有一个bug会引起pymysql报警,lib\site-packages\pymysql\cursors.py:170:Warning:(1265,”Datatruncatedforcolumn’使用mysql.connector可以避免该问题,安装pyth…

    2025年6月5日
    4
  • sql模糊查询like并使用concat拼接

    sql模糊查询like并使用concat拼接模糊查询insure_company,左起0104开头,右边模糊匹配。(like搭配%表示模糊匹配,concat拼接),claim_date同。放入mapper.xml文件中时,只需用#{参数名}代替sql查询中的具体数据即可。

    2022年4月30日
    245
  • ffmpeg源码编译_开源代码平台

    ffmpeg源码编译_开源代码平台 注:本文来转自http://www.aurora-x.net/wiki/CompileFFmpegWindows,前段时间用ffempg和x264开发了h264编码和解码的Filter,这篇文章是我编译ffmeg工程从网上搜到的最好的一份文档,及其详尽,我就是按照这个文档的一步一步地来做,第一次就顺利地完成了ffmepg的编译。如果你也在学习ffmpeg,来仔细学习一下这份文档吧,以后

    2022年9月25日
    3
  • IP地址分类及划分「建议收藏」

    IP地址分类及划分「建议收藏」IP地址分类IP地址由4段数据构成,每段1字节,8位二进制数。根据网络号和主机号所占位数的不同,将IP地址分为四类。A类地址A类IP地址,第一段一字节数据表示网络号,剩下三段表示主机号。规定网络号最高位必须为0,则可以表示00000001-01111111,即126(除去全0和全1)个网络,剩下的3个字节数据可以表示2^24-2个主机。A类子网掩码255.0.0.0.B类地址B类IP地址,前两段2个字节数据表示网络号,剩下两段表示主机号。规定网络号最高位必须为10,则范围从100000000

    2022年6月10日
    55
  • 智慧旅游大数据平台建设解决方案有哪些_智慧交通解决方案

    智慧旅游大数据平台建设解决方案有哪些_智慧交通解决方案202x年智慧旅游大数据平台建设解决方案(专业完整版).docx-Actionscript文档类资源-CSDN下载

    2025年5月28日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号