文档日期:2019年11月1日
本文参考了 http://www.lnmp.cn/mysql-57-new-features-json.html 的练习方法。
从MySQL5.7.8开始,MySQL支持原生的JSON数据类型。
创建JSON
类似varchar,设置主要将字段的type是json,不能设置长度,可以是NULL但不能有默认值。
create
使用 describe tool 查看创建的表结构:
写入一条数据:
INSERT
MYSQL也有专门的函数 JSON_OBJECT, JSON_ARRAY函数生成json格式的数据。
INSERT
查看插入的两条数据:
查询JSON
查询json中的数据使用 column->path 的形式,其中对象类型path这样表示 $.path,而数组类型则是 $[index]。
查看每一行数据的JSON类型,筛选如下:
例:筛选出catagory中 name = John的那条记录的所有tag:
通过json_type确定了tag的数据类型是ARRAY,那么就可以使用数组索引的方式查询:
上面的例子中,可以看到,使用 tag->'$[0]' 的方式如期获取了tag数组内的第一个数据。另外两个,一个tag->'$[893]'是不存在的数组元素,一个tag->'$.unexist'是不存在的对象键,都返回了 null,这与预期的一致。
还要一个小小的问题,返回的 tag->'$[0]' = "Low",并且左右有一对双引号,可否去掉呢?使用 JSON_UNQUOTE 函数。
我们用了一个快捷方式 ->> 对 JSON_UNQUOTE进行了引用,效果是一样的。
下面说JSON作为条件进行搜索。因为JSON不同于字符串,所以如果用字符串和JSON字段进行比较,是不会相等的。这时可以使用CAST函数,将字符串转成JSON的形式。
上图就是CAST的用法和比较的结果。
对应地,select字段中,和where筛选条件中,均可以使用 column->path 的方式操作。
特别注意的是,JSON中的元素是严格区分变量类型的,比如说整型和字符串是严格区分的。
除了用 column->path 的形式搜索,还可以用JSON_CONTAINS 函数,但和 column->path 的形式有点相反的是,JSON_CONTAINS 第二个参数是不接受整数的,无论 json 元素是整型还是字符串,否则会出现这个错误
箭头指出的位置,才是正确的写法。整数应该写成 'int',字符串则要看值内的情况,很多情况下需要带上双引号,'"string"',这样写。如下:
我们会在下一篇,专门介绍JSON字段的插入,更新,删除。
MYSQL5.7与MYSQL8.0之间,JSON字段的支持特性有所不同。最重要的更新操作,以及如何添加虚拟列用于加速JSON字段的查询索引,放在下章介绍。