一、方法罗列:

分类 函数 描述

创建json

json_array 创建json数组

json_object 创建json对象

json_quote 将json转成json字符串类型

查询json

json_contains 判断是否包含某个json值

json_contains_path 判断某个路径下是否包json值

json_extract 提取json值

column->path json_extract的简洁写法,MySQL 5.7.9开始支持

column->>path json_unquote(column -> path)的简洁写法

json_keys 提取json中的键值为json数组

json_search 按给定字符串关键字搜索json,返回匹配的路径

修改json

json_append 废弃,MySQL 5.7.9开始改名为json_array_append

json_array_append 末尾添加数组元素,如果原有值是数值或json对 象,则转成数组后,再添加元素

json_array_insert 插入数组元素

json_insert 插入值(插入新值,但不替换已经存在的旧值)

json_merge 合并json数组或对象

json_remove 删除json数据

json_replace 替换值(只替换已经存在的旧值)

json_set 设置值(替换旧值,并插入不存在的新值)

json_unquote 去除json字符串的引号,将值转成string类型

返回json属性

json_depth 返回json文档的最大深度

json_length 返回json文档的长度

json_type 返回json值得类型

json_valid 判断是否为合法json文档

二、使用例子:

MySQL 5.7.8开始支持 json类型.

create table t(id int,js json,PRIMARY KEY (`id`))

插入数据

insert into t values(1,'{"a":1,"s":"abc"}')

insert into t values(2,'[1,2,{"a":123}]')

insert into t values(3,'"str"')

insert into t values(4,'123')

直接提供字符串即可。还可以用JSON_Array和JSON_Object函数来构造

insert into t values(5,JSON_Object('key1',v1,'key2',v2))

insert into t values(4,JSON_Array(v1,v2,v3))

JSON_OBJECT([key, val[, key, val] ...])

JSON_ARRAY([val[, val] ...])

JSON_SET(json_doc, path, val[, path, val] ...)

修改数据

update t set js=json_set('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb') where id=1

结果js={"a":456,"s":"abc","b":"bbb"}

path中$就代表整个doc,然后可以用JavaScript的方式指定对象属性或者数组下标等.

执行效果,类似json的语法

$.a=456

$.b="bbb"

存在就修改,不存在就设置.

$.c.c=123

这个在javascript中会出错,因为.c为null。

但是在json_set('{}','$.c.c',123)中,不存在的路径将直接被忽略。

特殊的对于数组,如果目标doc不是数组则会被转换成[doc],然后再执行set,

如果set的下标超过数组长度,只会添加到数组结尾。

select json_set('{"a":456}','$[1]',123)

结果[{"a":456},123]。目标现被转换成[{"a":456}],然后应用$[1]=123。

select json_set('"abc"','$[999]',123)

结果["abc",123]。

再举几个例子

select json_set('[1,2,3]','$[0]',456,'$[3]','bbb')

结果[456,2,3,'bbb']

注意:

对于javascript中

var a=[1,2,3]

a.a='abc'

是合法的,但是一旦a转成json字符串,a.a就丢失了。

而在mysql中,这种算作路径不存在,因此

select json_set('[1,2,3]','$.a',456)

结果还是[1,2,3]

然后还有另外两个版本

JSON_INSERT(json_doc, path, val[, path, val] ...)

如果不存在对应属性则插入,否则不做任何变动

JSON_REPLACE(json_doc, path, val[, path, val] ...)

如果存在则替换,否则不做任何变动

这两个操作倒是没有javascript直接对应的操作

select json_insert('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb')

结果{"a":1,"s":"abc","b":"bbb"}

select json_replace('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb')

结果{"a":456,"s":"abc"}

加上删除节点

JSON_REMOVE(json_doc, path[, path] ...)

如果存在则删除对应属性,否则不做任何变动

select json_replace('{"a":1,"s":"abc"}','$.a','$.b')

结果{"s":"abc"}

涉及数组时,三个函数与json_set基本一样

select json_insert('{"a":1}','$[0]',456)

结果不变,认为0元素已经存在了,注意这里结果不是[{"a":1}]

select json_insert('{"a":1}','$[999]',456)

结果追加到数组结尾[{"a":1},456]

select json_replace('{"a":1}','$[0]',456)

结果456!而非[456]

select json_replace('{"a":1}','$[1]',456)

结果不变。

其实对于json_insert和json_replace来说一般情况没必要针对数组使用。

select json_remove('{"a":1}','$[0]')

结果不变!

select json_remove('[{"a":1}]','$[0]')

结果[]

总之涉及数组的时候要小心。

JSON_MERGE(json_doc, json_doc[, json_doc] ...)

将多个doc合并

select json_merge('[1,2,3]','[4,5]')

结果[1,2,3,4,5]。数组简单扩展

select json_merge('{"a":1}','{"b":2}')

结果{"a":1,"b":2}。两个对象直接融合。

特殊的还是在数组

select json_merge('123','45')

结果[123,45]。两个常量变成数组

select json_merge('{"a":1}','[1,2]')

结果[{"a":1},1,2]。目标碰到数组,先转换成[doc]

select json_merge('[1,2]','{"a":1}')

结果[1,2,{"a":1}]。非数组都追加到数组后面。

JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)

给指定的节点,添加元素,如果节点不是数组,则先转换成[doc]

select json_Array_append('[1,2]','$','456')

结果[1,2,456]

select json_Array_append('[1,2]','$[0]','456')

结果[[1,456],2]。指定插在$[0]这个节点,这个节点非数组,所以等效为

select json_Array_append('[[1],2]','$[0]','456')

JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)

在数组的指定下标处插入元素

SELECT JSON_ARRAY_INSERT('[1,2,3]','$[1]',4)

结果[1,4,2,3]。在$数组的下标1处插入

SELECT JSON_ARRAY_INSERT('[1,[1,2,3],3]','$[1][1]',4)

结果[1,[1,4,2,3],3]。在$[1]数组的下标1处插入

SELECT JSON_ARRAY_INSERT('[1,2,3]','$[0]',4,'$[1]',5)

结果[4,5,1,2,3]。注意后续插入是在前面插入基础上的,而非[4,1,5,2,3]

提取json信息的函数

JSON_KEYS(json_doc[, path])

返回指定path的key

select json_keys('{"a":1,"b":2}')

结果["a","b"]

select json_keys('{"a":1,"b":[1,2,3]}','$.b')

结果null。数组没有key

JSON_CONTAINS(json_doc, val[, path])

是否包含子文档

select json_contains('{"a":1,"b":4}','{"a":1}')

结果1

select json_contains('{"a":2,"b":1}','{"a":1}')

结果0

select json_contains('{"a":[1,2,3],"b":1}','[1,2]','$.a')

结果1。数组包含则需要所有元素都存在。

select json_contains('{"a":[1,2,3],"b":1}','1','$.a')

结果1。元素存在数组元素中。

JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)

检查路径是否存在

select JSON_CONTAINS_PATH('{"a":1,"b":1}', 'one','$.a','$.c')

结果1。只要存在一个

select JSON_CONTAINS_PATH('{"a":1,"b":1}', 'all','$.a','$.c')

结果0。必须全部存在。

select JSON_CONTAINS_PATH('{"a":1,"b":{"c":{"d":1}}}', 'one','$.b.c.d')

结果1。

select JSON_CONTAINS_PATH('{"a":1,"b":{"c":{"d":1}}}', 'one','$.a.c.d')

结果0。

JSON_EXTRACT(json_doc, path[, path] ...)

获得doc中某个或多个节点的值。

select json_extract('{"a":1,"b":2}','$.a')

结果1

select json_extract('{"a":[1,2,3],"b":2}','$.a[1]')

结果2

select json_extract('{"a":{"a":1,"b":2,"c":3},"b":2}','$.a.*')

结果[1,2,3]。a.*通配a所有属性的值返回成数组。

select json_extract('{"a":{"a":1,"b":2,"c":3},"b":4}','$**.b')

结果[2,4]。通配$中所有层次下的属性b的值返回成数组。

mysql5.7.9开始增加了一种简写方式:column->path

select id,js->'$.id' from t where js->'$.a'=1 order by js->'$.b'

等价于

select id,json_extract(js,'$.id')

from t where json_extract(js,'$.a')=1

order by json_extract(js,'$.b')

JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])

强大的查询函数,用于在doc中返回符合条件的节点,select则是在表中返回符合要求的纪录。

select json_search('{"a":"abc","b":{"c":"dad"}}','one','%a%')

结果$.a。和like一样可以用%和_匹配,在所有节点的值中匹配,one只返回一个。

select json_search('{"a":"abc","b":{"c":"dad"}}','all','%a%')

结果["$.a","$.b.c"]

select json_search('{"a":"abc","b":{"c":"dad"}}','all','%a%',null,'$.b')

结果["$.b.c"]。限制查找范围。

select json_search('{"a":"abc","b":{"c":"dad"},"c":{"b":"aaa"}}','all','%a%',null,'$**.b')

结果["$.b.c","$.c.b"]。查找范围还可使用通配符!在每个匹配节点和其下查找。

注意,只有json_extract和json_search中的path才支持通配,其他json_set,json_insert等都不支持。

JSON_LENGTH(json_doc[, path])

返回数组的长度,如果是object则是属性个数,常量则为1

select json_length('[1,2,3]')

结果3

select json_length('123')

结果1

select json_length('{"a":1,"b":2}')

结果2

可再跟path参数

select json_length('{"a":1,"b":[1,2,3]}','$.b')

结果3

JSON_DEPTH(json_doc)

返回doc深度

select json_depth('{}'),json_depth('[]'),json_depth('123')

结果1,1,1

select json_depth('[1,2,3,4,5,6]')

结果2

select json_depth('{"a":{"b":{"c":1}}}')

结果4

mysql json unquote_mysql json 操作相关推荐

  1. mysql json类型数组索引_MySQL JSON 类型数据操作

    1.Java 中动态扩展字段,会导致数据库表被锁,在MySQL 5.7.8版本之前,因为MySQL不能直接操作JSON类型数据,可以将一个字段设定成varchar类型,里面存放JSON格式数据,这样在 ...

  2. MySQL 8.0 可以操作 JSON 了,牛!

    作者 | 旺财不哭 来源 | https://www.jianshu.com/p/d4b012769a3b 经过漫长的测试,即将整体迁移至Mysql8.0; Mysql8.0 对于Json操作新增/优 ...

  3. mysql操作json优点和缺点_SQL-mysql操作json

    一 前言 MySQL 5.7.8 之后 支持 JSON (由rfc7159规定)数据类型,其能在字段中使用json 类型,做到了自动校验是否为json类型数据,否则插入数据会报异常:其次,储存json ...

  4. mysql的json函数与实例_Mysql实例详解Mysql中的JSON系列操作函数

    <Mysql实例详解Mysql中的JSON系列操作函数>要点: 本文介绍了Mysql实例详解Mysql中的JSON系列操作函数,希望对您有用.如果有疑问,可以联系我们. MYSQL必读前言 ...

  5. MySQL JSON 类型数据操作

    1.Java 中动态扩展字段,会导致数据库表被锁,在MySQL 5.7.8版本之前,因为MySQL不能直接操作JSON类型数据,可以将一个字段设定成varchar类型,里面存放JSON格式数据,这样在 ...

  6. mysql操作json优点和缺点_详解Mysql中的JSON系列操作函数

    前言 JSON是一种轻量级的数据交换格式,采用了独立于语言的文本格式,类似XML,但是比XML简单,易读并且易编写.对机器来说易于解析和生成,并且会减少网络带宽的传输. JSON的格式非常简单:名称/ ...

  7. MySQL 8.0 可以操作 JSON 了!!

    点击上方"逆锋起笔",选择"加为星标" 第一时间获取技术干货! 经过漫长的测试,即将整体迁移至Mysql8.0; Mysql8.0 对于Json操作新增/优化了 ...

  8. 【MySQL】对JSON数据操作(全网最全)

    [MySQL]对JSON数据操作(全网最全) 总所周知,mysql5.7以上提供了一种新的字段格式-json,大概是mysql想把非关系型和关系型数据库一口通吃,所以推出了这种非常好用的格式,这样,我 ...

  9. 学习记录439@MySQL json 数据相关操作

    问题引出 工作中,有个数据存储在mysql中是json字符串的形式,要修复数据,就需要操作这个json,笨办法是复制出来查找替换,简直是无奈,然后查询资料发现可以有函数直接操作json,意料之中. M ...

最新文章

  1. [转载]《吴恩达深度学习核心笔记》发布,黄海广博士整理!
  2. 二极管7种应用电路详解之三
  3. python天天学怎么样-Python天天学_03_基础三
  4. 模仿Spring实现一个类管理容器
  5. springboot使用redis做session会话管理
  6. python基础整数和浮点数(一)
  7. SQL Server:专业的DateTime范围
  8. bzoj3524: [Poi2014]Couriers / bzoj2223: [Coci 2009]PATULJCI 主席树
  9. python 安装xpath_python中使用XPath笔记
  10. [已破案] 镜像出问题了
  11. spring security oauth2 资源服务器配置
  12. python练习题及答案-听说你python基础入门了?100个经典练习题送给你(附完整答案)...
  13. 算法:螺旋矩阵算出N行N列的数组Spiral Matrix II
  14. 物联网解决方案:智慧物流方案
  15. Spring入门之bean的配置
  16. poppin_xpower_ 常城
  17. 基于B_spline 的非刚性形变
  18. 百位女星镂空装秀性感 展现的是赘肉还是性感
  19. 网络用语html,最新网络用语
  20. 山石岩读丨一文读懂区块链安全:区块链会带来哪些冲击?

热门文章

  1. excel导入plsql解决乱码问题
  2. linux下ds3231应用程序,DS3231.h和DS3231.C单片机mcu时钟芯片驱动下载
  3. 前端二维码扫描库html5-qrcode使用(据说已不能用)
  4. AndroidTools:网络工具-测试下载速度
  5. 阿里云SLB负载均衡配置(很详细哦)
  6. 四元数左乘右乘_四元数——旋转
  7. 关于最新WP8.1版本提交商店审核流程xx
  8. 牛逼公司系列——Netflix
  9. 超级好用的一个php上传图片类(随机名_缩略图_加水印),超级好用的一个php上传图片类(随机名,缩略图,加水印)...
  10. 为什么【网上邻居】中找不到计算机,都是NetBIOS名惹得祸。