Mysql 值删除双引号_json删除指定元素


文档日期: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 查看创建的表结构:


Mysql 值删除双引号_json删除指定元素_02


写入一条数据:


INSERT


MYSQL也有专门的函数 JSON_OBJECT, JSON_ARRAY函数生成json格式的数据。


INSERT


查看插入的两条数据:


Mysql 值删除双引号_Mysql 值删除双引号_03


查询JSON

查询json中的数据使用 column->path 的形式,其中对象类型path这样表示 $.path,而数组类型则是 $[index]

查看每一行数据的JSON类型,筛选如下:


Mysql 值删除双引号_json删除指定元素_04


例:筛选出catagory中 name = John的那条记录的所有tag:


Mysql 值删除双引号_json删除指定元素_05


通过json_type确定了tag的数据类型是ARRAY,那么就可以使用数组索引的方式查询:


Mysql 值删除双引号_json字符串多了双引号_06


上面的例子中,可以看到,使用 tag->'$[0]' 的方式如期获取了tag数组内的第一个数据。另外两个,一个tag->'$[893]'是不存在的数组元素,一个tag->'$.unexist'是不存在的对象键,都返回了 null,这与预期的一致。

还要一个小小的问题,返回的 tag->'$[0]' = "Low",并且左右有一对双引号,可否去掉呢?使用 JSON_UNQUOTE 函数。


Mysql 值删除双引号_Mysql 值删除双引号_07


我们用了一个快捷方式 ->>JSON_UNQUOTE进行了引用,效果是一样的。


下面说JSON作为条件进行搜索。因为JSON不同于字符串,所以如果用字符串JSON字段进行比较,是不会相等的。这时可以使用CAST函数,将字符串转成JSON的形式。


Mysql 值删除双引号_json字符串多了双引号_08


上图就是CAST的用法和比较的结果。

对应地,select字段中,和where筛选条件中,均可以使用 column->path 的方式操作。


Mysql 值删除双引号_json字符串多了双引号_09


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


Mysql 值删除双引号_json字符串多了双引号_10


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


Mysql 值删除双引号_json删除指定元素_11


箭头指出的位置,才是正确的写法。整数应该写成 'int',字符串则要看值内的情况,很多情况下需要带上双引号,'"string"',这样写。如下:


Mysql 值删除双引号_json 插入数据_12



我们会在下一篇,专门介绍JSON字段的插入,更新,删除。

MYSQL5.7与MYSQL8.0之间,JSON字段的支持特性有所不同。最重要的更新操作,以及如何添加虚拟列用于加速JSON字段的查询索引,放在下章介绍。