mysql从5.7开始已经支持JSON类型的字段。

支持的操作:添加,修改,置空,子key添加,子key重置,子key删除,通过子key查找等。

但是这里和普通字段的修改和查找不同,涉及到一些JSON类型特有的函数。

具体参考:http://www.lnmp.cn/mysql-57-new-features-json.html

除了文章上面说的那些,还有几个点需要注意:

1,JSON_CONTAINS函数

mysql> select * from test_json;
+----+------------------------------------+---------+
| id | j | name |
+----+------------------------------------+---------+
| 1 | {"url": "lnmp.cn", "name": "lnmp"} | |
| 2 | NULL | |

执行sql:

mysql> select * from test_json where JSON_CONTAINS(j,'lnmp', '$.name');
ERROR 3141 (22032): Invalid JSON text in argument 2 to function json_contains: "Invalid value." at position 0.
mysql> select * from test_json where JSON_CONTAINS(j,'"lnmp"', '$.name');
+----+------------------------------------+------+
| id | j | name |
+----+------------------------------------+------+
| 1 | {"url": "lnmp.cn", "name": "lnmp"} | |
+----+------------------------------------+------+
1 row in set (0.00 sec)

JSON_CONTAINS(field, value, subkey)

第一个参数是字段名,第二个参数是查找的值,第三个参数是查找的子key。

这里的value有些限制条件,比如正整数1,需要写成'1';如果是字符串"lnmp",要写成'"lnmp"'。sql才是有效的。

2,几种不同类型的空数组

JSON类型的数,可以支持null,{}, [],{'k':'v'},这些类型。

null:默认值就是null,可以单独设置null;

{}:空的键值对,可以用cast('{}' as JSON)来设置;

[]:空的数组,可以用cast('[] as JSON')来设置,注意这里并不是集合的概念,里面的值是允许重复的;

{'k':'v'}:有键值对的数组,可以用cast来设置;

mysql> select * from test_json;
+----+------------------------------------+---------+
| id | j | name |
+----+------------------------------------+---------+
| 1 | {"url": "lnmp.cn", "name": "lnmp"} | |
| 2 | NULL | |
| 3 | {} | |
| 4 | NULL | brother |
| 5 | [100, 100, 200] | sister |
+----+------------------------------------+---------+
5 rows in set (0.00 sec)

3,应用中有很多场景,子key不是string,而是int类型,对于这样的场景如何应对的?

A,添加子key为int类型的数据:

insert into test_json (j) values(cast('{0:"100",1:"200"}' as JSON));
ERROR 3141 (22032): Invalid JSON text in argument 1 to function cast_as_json: "Missing a name for object member." at position 1.

由此可见,直接添加int型的子key是有问题的。

B,添加子key为string类型,但是值为数字型的数据:

mysql> insert into test_json (j) values(cast('{"0":"100","1":"200"}' as JSON));
Query OK, 1 row affected (0.01 sec) mysql> select * from test_json;
+----+------------------------------------+---------+
| id | j | name |
+----+------------------------------------+---------+
| 1 | {"url": "lnmp.cn", "name": "lnmp"} | |
| 2 | NULL | |
| 3 | {} | |
| 4 | NULL | brother |
| 5 | [100, 100, 200] | sister |
| 6 | {"100": "100", "200": "200"} | |
| 7 | {"0": "100", "1": "200"} | |
+----+------------------------------------+---------+
7 rows in set (0.00 sec)

结论:如果要添加数字型的子key,必须包含引号,int型转成string型才可以。

C,按子key查找条目:

mysql> select * from test_json where JSON_CONTAINS(j, '"100"', '$."0"');
+----+--------------------------+------+
| id | j | name |
+----+--------------------------+------+
| 7 | {"0": "100", "1": "200"} | |
+----+--------------------------+------+
1 row in set (0.00 sec)

这里有两个点要注意,1是第二个参数必须是带印号,2是第三个参数的键值名称必须带双引号,而不是之前的'$.name'这样的方式。

D,select中带有子key:

mysql> select j->'$."0"' from test_json where id=7;
+------------+
| j->'$."0"' |
+------------+
| "100" |
+------------+
1 row in set (0.00 sec)

和C注意的点是一样子的。

【mysql】字段支持JSON类型的更多相关文章

  1. MySQL中的JSON类型

    前言(废话) 昨天抽了点时间在网上搜列了一个开源项目,项目挺完整的,前后台分离还带有微信小程序,我Clone下代码,经过一番倒腾,嘿~还真就跑起来了.在这个过程中,体验了一把VUE项目工程细节,因为之 ...

  2. #MySQL 5.7.8 支持Json类型

    As of MySQL 5.7.8, MySQL supports a native JSON data type that enables efficient access to data in J ...

  3. 更改mysql字段的编码类型为utf8mb4

    ALTER TABLE tb_case MODIFY COLUMN content VARCHAR(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode ...

  4. MySQL json 类型操作快速入门

    MySQL 5.7.8开始支持 json类型. create table t(id int,js json,PRIMARY KEY (`id`)) 插入数据insert into t values(1 ...

  5. MySQL 5.7 使用原生JSON类型

    首先回顾一下JSON的语法规则: 数据在键值对中, 数据由逗号分隔, 花括号保存对象, 方括号保存数组. 按照最简单的形式,可以用下面的JSON表示: {"NAME": " ...

  6. 一些应该使用mongodb或者其他文档存储而不是redis或mysql、oracle json的情形(最近更新场景)

    通常来说,我们应该使用应用的特性而不是自己的爱好或者规定而去选择一种合适的组件,选择的标准应该是这个组件最适合或者本身其设计就是为了解决这个问题,而不是这个组件能够做这事情为标准.就拿存储来说,任何时 ...

  7. MySQL字段数据类型表

    * MySQL支持所有标准SQL数值数据类型. 数值类型BIT数据类型保存位字段值,并且支持MyISAM.MEMORY.InnoDB和BDB表.作为SQL标准的扩展,MySQL也支持整数类型TINYI ...

  8. Mysql 数据类型、约束类型

    mysql数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型.   数值类型 MySQL支持所有标准 ...

  9. mysql 5.7 json 字段类型查找、修改

    修改 json 里的数组字段 mysql> set @json = '{"test": [{"name": "laravel"}, { ...

随机推荐

  1. LInux 阿里云系统遇到挖矿程序

    参考 https://blog.csdn.net/qq_37837029/article/details/82314428 重要的一点,移除下面文件里面的定时任务 /var/spool/cron/cr ...

  2. Flex_概念

    1.Flex是事件驱动的面向对象应用程序框架和编程语言.Flex应用程序加载完毕后,需要做的就是捕获事件,然后作出响应.    Flex是一个庞大的技术组群中的一员.  2.RIA(Rich Inte ...

  3. 修改 计算机名后,修改SQLserver 注册服务器对象的名称,及登陆名

    select @@ServerName --查看当前所有数据库服务器名称select * from Sys.SysServers --修改数据库服务器名称sp_dropserver 'old_serv ...

  4. Python3.7中urllib.urlopen 报错问题

    import urllib web = urllib.urlopen('https://www.baidu.com') f = web.read() print(f) 报错: Traceback (m ...

  5. Learn English like a Baby – How to Sound Native

    Learn English like a Baby – How to Sound Native Share Tweet Share Tagged With: tips & tricks Wha ...

  6. centos7启动iptables时报Job for iptables.service failed because the control process exited with error cod

    centos7启动iptables时报Job for iptables.service failed because the control process exited with error cod ...

  7. Notepad++好用的功能和插件

    Notepad++是一款Windows环境下免费开源的代码编辑器,支持Python,shell,Java等主流语言编写.本文主要描述Notepad++一些好用但是容易忽视的功能. 1.根据文件内容查找 ...

  8. vue项目bug-Couldn’t find preset "es2015"

    在使用vue项目的时候安装了其他的插件,发现会报错 Couldn’t find preset "es2015".是因引用的插件使用了es标准,解决办法如下 npm install ...

  9. 1.Tomcat配置.md

    1.启动 解压缩安装包后,点击startup.bat,保持控制台窗口开启 浏览器中输入http://localhost:8080 后看到启动界面则表示启动成功 点击shutdown.bat则关闭Tom ...

  10. C++ 动态创建按钮及 按钮的消息响应

    动态创建的按钮 都会在消息 OnCommand 中得到处理,无论是什么消息,都会处理的 1\创建按钮 CButton* btn = new CButton(); btn->Create(_T(, ...