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. Django 之Form

    具体可参考:http://www.liujiangblog.com/course/django/153 https://www.cnblogs.com/liuguniang/p/7141837.htm ...

  2. redis 学习笔记1(安装以及控制台命令)

    为什么要学习这个? 分布式技术必会,得益于redis的设计理念,内存数据库,epoll(多路复用)模型,单线程模型除去了锁和上下文切换,提高了性能.单线程保证执行顺序(轮询),在分布式环境下对于数据的 ...

  3. h5 图片生成

    createImg(store, data) { let timer = setTimeout(function (params) { let _canvas = document.querySele ...

  4. Servlet基本_Filter

    1.概念・サーブレットフィルタとは.サーブレットやJSPの「共通の前後処理」を記述するための仕組みです.・フィルタはサーブレットやJSPの前に位置し.実行前と後に.リクエスト.レスポンスに対して任意の ...

  5. vim主题设定

    Vim的颜色主题在/usr/share/vim/vim74/colors文件夹里. 打开vim后在normal模式下输入“:colorscheme”查看当前的主题,修改主题使用命令“:colorsch ...

  6. Redis进阶实践之三如何在Windows系统上安装安装Redis(转载)

    Redis进阶实践之三如何在Windows系统上安装安装Redis 一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括 ...

  7. 遍历DOM树,获取子节点

    获取子节点的方法有:  方法  说明  children()  选取子节点,可以带过滤参数.但只能选择子节点,不能选择孙子节点.  find()  选取子节点,可以带过滤参数.可以选择子节点及孙子节点 ...

  8. Anaconda安装及配合pycharm使用

    首先到https://www.anaconda.com/download/下载合适的anaconda版本.如Windows 64bit. 下载了直接双击开始下载,一路同意下去,到选择安装的目录.这里选 ...

  9. work单进程群发通知 后面会增加Channel组件的分组推送以及集群推送篇章

    <?phpuse Workerman\Worker;use Workerman\Lib\Timer; require_once '../../web/Workerman/Autoloader.p ...

  10. 面向对象程序设计(Java)本学期课程改革说明

    1.教学方式采用反转课堂教学法,学生课前完成知识的学习,课堂是师生之间.学生之间互动的场所,包括答疑解惑.知识的运用技巧探讨等,教师的课堂责任是理解学生的问题和引导学生去运用知识. 2.为更好地执行反 ...