mysql JSON格式简介和JSON函数详解

Mysql存储json格式数据 Mysql5.7版本以后新增的功能,Mysql提供了一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(documentelements)的内部二进制(internalbinary)格式。在Json列插入或者更新的时候将会自动验证Json文本,未通过验证的文本将产生一个错误信息创建表t_user登录方式字段使用json格式,分为phone,wechat,qq,email,zhifubao等等。... 阅读详情

目录

JSON格式简介

定义用户变量

JSON格式的规范化

JSON的路径表达式

JSON的比较和排序

JSON的函数

一,创建JSON格式数据

1,JSON_ARRAY([val[, val] …])

2,JSON_OBJECT([key, val[, key, val] …])

3,JSON_QUOTE(string)

二,JSON的查询

1,JSON_CONTAINS(target, candidate[, path])

2,JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] …)

3,JSON_EXTRACT(json_doc, path[, path] …)

4,->运算符

5,->>运算符

6,JSON_KEYS(json_doc[, path])

7,JSON_OVERLAPS(json_doc1, json_doc2)

8,JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] …])

9,value MEMBER OF(json_array)

三,JSON值的修改

1,JSON_ARRAY_APPEND(json_doc, path, val[, path, val] …)

2,JSON_ARRAY_INSERT(json_doc, path, val[, path, val] …)

3,JSON_INSERT(json_doc, path, val[, path, val] …)

4,JSON_MERGE(json_doc, json_doc[, json_doc] …)

5,JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] …)

6,JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] …)

7,JSON_REMOVE(json_doc, path[, path] …)

8,JSON_REPLACE(json_doc, path, val[, path, val] …)

9,JSON_SET(json_doc, path, val[, path, val] …)

10,JSON_UNQUOTE(json_val)

四,JSON值的属性

1,JSON_DEPTH(json_doc)

2,JSON_LENGTH(json_doc[, path])

3,JSON_TYPE(json_val)

4,JSON_VALID(val)

五,JSON临时表函数

六,JSON格式校验

1,JSON_SCHEMA_VALID(schema,document)

2,JSON_SCHEMA_VALIDATION_REPORT(schema,document)

七,JSON辅助函数

1,JSON_PRETTY(json_val)

2,JSON_STORAGE_FREE(json_val)

3,JSON_STORAGE_SIZE(json_val)

JSON格式简介
MySQL8.0开始支持JSON格式,可以对JSON格式的数据进行高效的访问。

和原来JSON格式的字符串相比,JSON格式有以下的优点:

1,自动验证。错误的JSON格式会报错。

2,存储格式优化。数据保存为二进制格式,文件存储很紧凑,读取速度快。

3,MySQL可以通过键或数组索引查询和修改对应的值,不用把整个字符串都读出来。

一些其他的介绍:

1,JSON格式需要的磁盘空间和longblob或longtext差不多。

2,JSON格式的默认值只能是null。

3,JSON格式的列不能直接建立索引,可以建立JSON索引。

4,JSON格式的key必须是字符串格式。value可以是字符串,数字,布尔型。

5,JSON格式默认使用utf8mb4字符集,utf8mb4-bin排序,其他字符集使用JSON格式需要做字符集转换。ascii或utf8不用转换,他们是utf8mb4的子集。

6,大小写敏感,而且true,false,null这些关键字在JSON格式里都必须小写。说白了就是:null,Null,NULL,都是null,但是"Null"无法转成null,只有"null"才能转成null。

比如:

mysql> SELECT JSON_ARRAY(‘x’) = JSON_ARRAY(‘X’);
±----------------------------------+
| JSON_ARRAY(‘x’) = JSON_ARRAY(‘X’) |
±----------------------------------+
|                                 0 |
±----------------------------------+
 
mysql> SELECT JSON_VALID(‘null’), JSON_VALID(‘Null’), JSON_VALID(‘NULL’);
±-------------------±-------------------±-------------------+
| JSON_VALID(‘null’) | JSON_VALID(‘Null’) | JSON_VALID(‘NULL’) |
±-------------------±-------------------±-------------------+
|                  1 |                  0 |                  0 |
±-------------------±-------------------±-------------------+
 
mysql> SELECT CAST(‘null’ AS JSON);
±---------------------+
| CAST(‘null’ AS JSON) |
±---------------------+
| null                 |
±---------------------+
1 row in set (0.00 sec)
 
mysql> SELECT CAST(‘NULL’ AS JSON);
ERROR 3141 (22032): Invalid JSON text in argument 1 to function cast_as_json:
“Invalid value.” at position 0 in ‘NULL’.
 
mysql> SELECT ISNULL(null), ISNULL(Null), ISNULL(NULL);
±-------------±-------------±-------------+
| ISNULL(null) | ISNULL(Null) | ISNULL(NULL) |
±-------------±-------------±-------------+
|            1 |            1 |            1 |
±-------------±-------------±-------------+
7,JSON格式中包含单引号或双引号时,需要用一条反斜线来转义。

8,JSON格式会丢弃一些额外的空格,并且会把键值对排序。

定义用户变量
使用例子:

mysql> SET @j = JSON_OBJECT(‘key’, ‘value’);
mysql> SELECT @j;
±-----------------+
| @j               |
±-----------------+
| {“key”: “value”} |
±-----------------+
注意,定义的用户变量不再是JSON格式,而是String格式,这个是在赋值给变量的时候转的。另外,变量的字符集和排序规则和JSON格式相同:utf8mb4和utf8mb4_bin:

mysql> SELECT CHARSET(@j), COLLATION(@j);
±------------±--------------+
| CHARSET(@j) | COLLATION(@j) |
±------------±--------------+
| utf8mb4     | utf8mb4_bin   |
±------------±--------------+

JSON格式的规范化
当产生JSON格式的数据时,MySQL会把JSON规范化,当有相同的key存在时,后面的key会覆盖前面的key。8.0.3及之前版本有bug。

举例:

mysql> SELECT JSON_OBJECT(‘key1’, 1, ‘key2’, ‘abc’, ‘key1’, ‘def’);
±-----------------------------------------------------+
| JSON_OBJECT(‘key1’, 1, ‘key2’, ‘abc’, ‘key1’, ‘def’) |
±-----------------------------------------------------+
| {“key1”: “def”, “key2”: “abc”}                       |
±-----------------------------------------------------+
 
mysql> CREATE TABLE t1 (c1 JSON);
 
mysql> INSERT INTO t1 VALUES
     >     (’{“x”: 17, “x”: “red”}’),
     >     (’{“x”: 17, “x”: “red”, “x”: [3, 5, 7]}’);
 
mysql> SELECT c1 FROM t1;
±-----------------+
| c1               |
±-----------------+
| {“x”: “red”}     |
| {“x”: [3, 5, 7]} |
±-----------------+

JSON的路径表达式
MySQL用路径表达式对JSON格式的数据进行查询。

路径表达式中用$代表JSON值。
用key值代表该key对应的元素。
用[N]代表JSON数组中的第N个元素。序号从0开始。
用[M to N]代表JSON数组中第M个至第N个元素。序号从0开始。
用.[]通配符代表JSON对象的所有子元素。
用[
]通配符代表JSON数组的所有元素。
用**通配符代表用某字符开头或结尾的元素。

在JSON数组中查询

如果用$代表以下JSON:

[3, {“a”: [5, 6], “b”: 10}, [99, 100]]

那么:

$[0] 指向 3。
$[1] 指向 {“a”: [5, 6], “b”: 10}。
$[2] 指向 [99, 100]。
$[3] 指向 NULL。因为没有第四个元素。
$[1].a 指向 [5, 6]。
$[1].a[1] 指向 6。
$[1].b 指向 10。
[2][0]指向99。注意到[2][0] 指向 99。 注意到[2][0]指向99。注意到[1].a中的a可以不写引号。而如果key名中有空格,则必须加引号,见后面的例子。

在JSON对象中查询

如果用$代表以下JSON:

{“a fish”: “shark”, “a bird”: “sparrow”}

那么:

$.“a fish” 指向 shark。
$.“a bird” 指向 sparrow。
注意,"a fish"这个key值中有空格,所以引号是必须加的。

*通配符的查询:

mysql> SELECT JSON_EXTRACT(’{“a”: 1, “b”: 2, “c”: [3, 4, 5]}’, ‘.∗′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONEXTRACT(′"a":1,"b":2,"c":[3,4,5]′,′.*'); +---------------------------------------------------------+ | JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}', '.∗′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONE​XTRACT(′"a":1,"b":2,"c":[3,4,5]′,′.’) |
±--------------------------------------------------------+
| [1, 2, [3, 4, 5]]                                       |
±--------------------------------------------------------+
mysql> SELECT JSON_EXTRACT(’{“a”: 1, “b”: 2, “c”: [3, 4, 5]}’, '.c[∗]′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONEXTRACT(′"a":1,"b":2,"c":[3,4,5]′,′.c[*]'); +------------------------------------------------------------+ | JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}', '.c[∗]′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONE​XTRACT(′"a":1,"b":2,"c":[3,4,5]′,′.c[
]’) |
±-----------------------------------------------------------+
| [3, 4, 5]                                                  |
±-----------------------------------------------------------+

**通配符的查询:

mysql> SELECT JSON_EXTRACT(’{“a”: {“b”: 1}, “c”: {“b”: 2}}’, ‘∗∗.b′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONEXTRACT(′"a":"b":1,"c":"b":2′,′**.b'); +---------------------------------------------------------+ | JSON_EXTRACT('{"a": {"b": 1}, "c": {"b": 2}}', '∗∗.b′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONE​XTRACT(′"a":"b":1,"c":"b":2′,′**.b’) |
±--------------------------------------------------------+
| [1, 2]                                                  |
±--------------------------------------------------------+

正序范围查询

范围查询使用[M to N]这样的表达式,注意序号是从0开始的,比如:

mysql> SELECT JSON_EXTRACT(’[1, 2, 3, 4, 5]’, ‘[1to3]′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONEXTRACT(′[1,2,3,4,5]′,′[1 to 3]'); +----------------------------------------------+ | JSON_EXTRACT('[1, 2, 3, 4, 5]', '[1to3]′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONE​XTRACT(′[1,2,3,4,5]′,′[1 to 3]’) |
±---------------------------------------------+
| [2, 3, 4]                                    |
±---------------------------------------------+
1 row in set (0.00 sec)

倒序范围查询

倒序查询使用[last-M to last-N]这样的表达式,注意逆向的序号也是从0开始的,比如:

mysql> SELECT JSON_EXTRACT(’[1, 2, 3, 4, 5]’, ‘[last−3tolast−1]′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONEXTRACT(′[1,2,3,4,5]′,′[last-3 to last-1]'); +--------------------------------------------------------+ | JSON_EXTRACT('[1, 2, 3, 4, 5]', '[last−3tolast−1]′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONE​XTRACT(′[1,2,3,4,5]′,′[last-3 to last-1]’) |
±-------------------------------------------------------+
| [2, 3, 4]                                              |
±-------------------------------------------------------+
1 row in set (0.01 sec)
注意,如果last关键字用于非数组时,效果等同于先把目标对象封装成单元素数组,然后再操作,比如:

mysql> SELECT JSON_REPLACE(’“Sakila”’, ‘[last]′,10);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONREPLACE(′"Sakila"′,′[last]', 10); +-----------------------------------------+ | JSON_REPLACE('"Sakila"', '[last]′,10);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONR​EPLACE(′"Sakila"′,′[last]’, 10) |
±----------------------------------------+
| 10                                      |
±----------------------------------------+
1 row in set (0.00 sec)

JSON的比较和排序
可支持的操作符:=, <, <=, >, >=, <>, !=, and <=>

不支持的操作符:BETWEEN,IN(),GREATEST(),LEAST()。可以把JSON中的值解析出来然后用可支持的操作符来做判断。

JSON值的比较有数据类型优先级的概念,不同优先级的数据类型比较时,由较高优先级的类型决定。数据类型的优先级从大到小分别是:

BLOB
BIT
OPAQUE
DATETIME
TIME
DATE
BOOLEAN
ARRAY
OBJECT
STRING
INTEGER, DOUBLE
NULL
下面分别介绍一下排序规则:

1,BLOB

比较两个JSON值的前N个字符,N是较短值中的字节数。如果前N个字符相同,较短值排在较大值前面。

2,BIT

同BLOB。

3,OPAQUE

同BLOB。

4,DATETIME

按时间排序。

5,TIME

按时间排序。

6,DATE

按时间排序。

7,BOOLEAN

false小于true。可能原理是false=0,true=1。

8,ARRAY

由数组中第一个不同元素决定大小,如果较短数组的全部元素都等于较长数组中的对应元素,则短数组排在前面。比如:

[] < [“a”] < [“ab”] < [“ab”, “cd”, “ef”] < [“ab”, “ef”]

9,OBJECT

如果两个JSON对象有相同的键集,而且每个键对应的值都相等,那么两个JSON对象就相等。

10,STRING

比较两个JSON值的前N个字符,N是较短值中的字符数。如果前N个字符相同,较短值排在较大值前面。

11,INTEGER, DOUBLE

比较数字大小。

12,NULL

如果比较双方有NULL,比较的结果为UNKNOWN。

JSON的函数

一,创建JSON格式数据

1,JSON_ARRAY([val[, val] …])
根据参数值创建JSON数组,每个参数都是数组中一个元素。

举例:

mysql> SELECT JSON_ARRAY(1, “abc”, NULL, TRUE, CURTIME());
±--------------------------------------------+
| JSON_ARRAY(1, “abc”, NULL, TRUE, CURTIME()) |
±--------------------------------------------+
| [1, “abc”, null, true, “10:27:46.000000”]   |
±--------------------------------------------+
1 row in set (0.00 sec)

2,JSON_OBJECT([key, val[, key, val] …])
根据参数列表创建JSON对象。

按照参数的排列,第一个是key,第二个是value,第三个是key,以此类推。参数个数必须是双数。

参数列表可以为空,得到空JSON:{}。

key不能是null。否则报错。value可以是null。

数据类型错误时会报错。

举例:

mysql> SELECT JSON_OBJECT(‘id’, 87, ‘name’, ‘carrot’);
±----------------------------------------+
| JSON_OBJECT(‘id’, 87, ‘name’, ‘carrot’) |
±----------------------------------------+
| {“id”: 87, “name”: “carrot”}            |
±----------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_OBJECT(‘id’, 87, null, ‘carrot’);  
ERROR 3158 (22032): JSON documents may not contain NULL member names.
 
mysql> SELECT JSON_OBJECT(‘id’, 87, ‘name’, NULL);
±------------------------------------+
| JSON_OBJECT(‘id’, 87, ‘name’, NULL) |
±------------------------------------+
| {“id”: 87, “name”: null}            |
±------------------------------------+
1 row in set (0.00 sec)

3,JSON_QUOTE(string)
用双引号把字符串括起来,把结果转为utf8mb4并返回。其中会经过JSON的转义。目的是得到JSON的字符串形式。

mysql> SELECT JSON_QUOTE(‘null’), JSON_QUOTE(’“null”’);
±-------------------±---------------------+
| JSON_QUOTE(‘null’) | JSON_QUOTE(’“null”’) |
±-------------------±---------------------+
| “null”             | ““null””           |
±-------------------±---------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_QUOTE(’[1, 2, 3]’);
±------------------------+
| JSON_QUOTE(’[1, 2, 3]’) |
±------------------------+
| “[1, 2, 3]”             |
±------------------------+
1 row in set (0.01 sec)

二,JSON的查询

1,JSON_CONTAINS(target, candidate[, path])
检查候选JSON是否包含在目标JSON中,1表示包含,0表示不包含。

target是目标元素,candidate是候选元素,path是路径表达式,如果path有值,则目标元素需要先经过路径表达式的处理再参与判断。

此函数可以使用多值索引。

另有如下规则:

1)参数可比时才能使用此函数。json_type()相同时才能使用此函数,另外integer和decimal类型可以直接比。

2)数组包含在数组中。只有目标数组的每个元素都包含在候选数组中,才算包含。

3)非数组包含在数组中。只有候选JSON对象包含在目标数组的某个元素中,才算包含。

4)非数组包含在非数组中。当且仅当候选JSON对象的每个key,在目标JSON对象中都有同名的key和同值的value,才算包含。

比如:

mysql> SELECT JSON_CONTAINS(’{“a”: 1, “b”: 2, “c”: {“d”: 4}}’, ‘1’, ‘.a′);   +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONCONTAINS(′"a":1,"b":2,"c":"d":4′,′1′,′.a');      +--------------------------------------------------------------+ | JSON_CONTAINS('{"a": 1, "b": 2, "c": {"d": 4}}', '1', '.a′);   +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONC​ONTAINS(′"a":1,"b":2,"c":"d":4′,′1′,′.a’) |
±-------------------------------------------------------------+
|                                                            1 |
±-------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_CONTAINS(’{“a”: 1, “b”: 2, “c”: {“d”: 4}}’, ‘1’, ‘.b′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONCONTAINS(′"a":1,"b":2,"c":"d":4′,′1′,′.b'); +--------------------------------------------------------------+ | JSON_CONTAINS('{"a": 1, "b": 2, "c": {"d": 4}}', '1', '.b′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONC​ONTAINS(′"a":1,"b":2,"c":"d":4′,′1′,′.b’) |
±-------------------------------------------------------------+
|                                                            0 |
±-------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_CONTAINS(’{“a”: 1, “b”: 2, “c”: {“d”: 4}}’, ‘{“d”:4}’, ‘.b′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONCONTAINS(′"a":1,"b":2,"c":"d":4′,′"d":4′,′.b'); +--------------------------------------------------------------------+ | JSON_CONTAINS('{"a": 1, "b": 2, "c": {"d": 4}}', '{"d":4}', '.b′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONC​ONTAINS(′"a":1,"b":2,"c":"d":4′,′"d":4′,′.b’) |
±-------------------------------------------------------------------+
|                                                                  0 |
±-------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_CONTAINS(’{“a”: 1, “b”: 2, “c”: {“d”: 4}}’, ‘{“d”:4}’, ‘.c′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONCONTAINS(′"a":1,"b":2,"c":"d":4′,′"d":4′,′.c'); +--------------------------------------------------------------------+ | JSON_CONTAINS('{"a": 1, "b": 2, "c": {"d": 4}}', '{"d":4}', '.c′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONC​ONTAINS(′"a":1,"b":2,"c":"d":4′,′"d":4′,′.c’) |
±-------------------------------------------------------------------+
|                                                                  1 |
±-------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_CONTAINS(’{“a”: 1, “b”: 2, “c”: {“d”: 4}}’, “{“d”:4}”, ‘KaTeX parse error: Can't use function '\"' in math mode at position 137: … {"d": 4}}', "{\̲"̲d\":4}", '.c’) |
±---------------------------------------------------------------------+
|                                                                    1 |
±---------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_CONTAINS(’{“a”: 1, “b”: 2, “c”: {“d”: 4}}’, “{“d”:“4”}”, ‘KaTeX parse error: Can't use function '\"' in math mode at position 137: … {"d": 4}}', "{\̲"̲d\":\"4\"}", '.c’) |
±-------------------------------------------------------------------------+
|                                                                        0 |
±-------------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_CONTAINS(’[“abc”,“def”]’,’“abc”’);
±---------------------------------------+
| JSON_CONTAINS(’[“abc”,“def”]’,’“abc”’) |
±---------------------------------------+
|                                      1 |
±---------------------------------------+
注意,候选JSON和目标JSON都得是JSON格式的字符串,单个元素也得加引号,数字要写成这样:“1”,字符串要引号外面再套引号,写成这样:’“abc”’。

2,JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] …)
判断目标JSON中是否存在指定的路径或路径列表。

第一个参数是目标JSON。

第二个参数可以选择one或all。如果选择one,那么只要其中一条路径是存在的就返回1,否则返回0。如果选择all,那么必须所有路径都存在才返回1,否则返回0。

举例:

mysql> SELECT JSON_CONTAINS_PATH(’{“a”: 1, “b”: 2, “c”: {“d”: 4}}’, ‘one’, ‘.a′,′.a', '.a′,′.e’);  
±---------------------------------------------------------------------------+
| JSON_CONTAINS_PATH(’{“a”: 1, “b”: 2, “c”: {“d”: 4}}’, ‘one’, ‘.a′,′.a', '.a′,′.e’) |
±---------------------------------------------------------------------------+
|                                                                          1 |
±---------------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_CONTAINS_PATH(’{“a”: 1, “b”: 2, “c”: {“d”: 4}}’, ‘all’, ‘.a′,′.a', '.a′,′.e’);   
±---------------------------------------------------------------------------+
| JSON_CONTAINS_PATH(’{“a”: 1, “b”: 2, “c”: {“d”: 4}}’, ‘all’, ‘.a′,′.a', '.a′,′.e’) |
±---------------------------------------------------------------------------+
|                                                                          0 |
±---------------------------------------------------------------------------+
1 row in set (0.00 sec)

3,JSON_EXTRACT(json_doc, path[, path] …)
从目标JSON中返回对应路径下的元素。如果匹配到多个元素则封装成数组。

比如:

mysql> SELECT JSON_EXTRACT(’[10, 20, [30, 40]]’, ‘[1]′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONEXTRACT(′[10,20,[30,40]]′,′[1]'); +--------------------------------------------+ | JSON_EXTRACT('[10, 20, [30, 40]]', '[1]′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONE​XTRACT(′[10,20,[30,40]]′,′[1]’) |
±-------------------------------------------+
| 20                                         |
±-------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_EXTRACT(’[10, 20, [30, 40]]’, ‘[1]′,′[1]', '[1]′,′[0]’);
±---------------------------------------------------+
| JSON_EXTRACT(’[10, 20, [30, 40]]’, ‘[1]′,′[1]', '[1]′,′[0]’) |
±---------------------------------------------------+
| [20, 10]                                           |
±---------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_EXTRACT(’[10, 20, [30, 40]]’, ‘[2][∗]′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONEXTRACT(′[10,20,[30,40]]′,′[2][*]'); +-----------------------------------------------+ | JSON_EXTRACT('[10, 20, [30, 40]]', '[2][∗]′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONE​XTRACT(′[10,20,[30,40]]′,′[2][*]’) |
±----------------------------------------------+
| [30, 40]                                      |
±----------------------------------------------+
1 row in set (0.00 sec)

4,->运算符
此运算符是JSON_EXTRACT()函数的简写,单个path的场景。

这个运算符几乎可以出现在sql的所有位置,而且在select,update等语句中都能用,比如:

mysql> SELECT c, JSON_EXTRACT(c, “.id"),g   >FROMjemp   >WHEREJSONEXTRACT(c,".id"), g      > FROM jemp      > WHERE JSON_EXTRACT(c, ".id"),g   >FROMjemp   >WHEREJSONE​XTRACT(c,".id”) > 1
     > ORDER BY JSON_EXTRACT(c, “$.name”);
这个语句可以替换为:

mysql> SELECT c, c->".id",g   >FROMjemp   >WHEREc−>".id", g      > FROM jemp      > WHERE c->".id",g   >FROMjemp   >WHEREc−>".id" > 1
     > ORDER BY c->"$.name";
另外,在EXPLAIN结果的WARING中,->表达式被展开成json_extract()函数:

mysql> explain select a->’KaTeX parse error: Expected 'EOF', got '#' at position 1046: …003 | /* select#̲1 */ select jso….name’) AS a->'$.name' from dev.test_j |
±------±-----±-----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

5,->>运算符
->>运算符是加强版的->运算符,他把->运算符得到的结果去掉了引号,就像JSON_UNQUOTE ()函数一样,所以,以下三个表达式所代表的含义是一样的:

JSON_UNQUOTE( JSON_EXTRACT(column, path) )
JSON_UNQUOTE(column -> path)
column->>path
和->>运算符一样,->>运算符可以被用到sql中的很多位置。

举例:

mysql> select * from test_j;
±------------------------------+
| a                             |
±------------------------------+
| {“id”: “3”, “name”: “Barney”} |
| {“id”: “4”, “name”: “Betty”}  |
±------------------------------+
2 rows in set (0.00 sec)
 
mysql> select a->’.name′fromtestj;+−−−−−−−−−−−−−+∣a−>′.name' from test_j; +-------------+ | a->'.name′fromtestj​;+−−−−−−−−−−−−−+∣a−>′.name’ |
±------------+
| “Barney”    |
| “Betty”     |
±------------+
2 rows in set (0.00 sec)
 
mysql> select a->>’.name′fromtestj;+−−−−−−−−−−−−−−+∣a−>>′.name' from test_j; +--------------+ | a->>'.name′fromtestj​;+−−−−−−−−−−−−−−+∣a−>>′.name’ |
±-------------+
| Barney       |
| Betty        |
±-------------+
2 rows in set (0.00 sec)
另外,和->运算符一样,在EXPLAIN语句结果中,->>运算符会被展开:

mysql> explain select a->>’KaTeX parse error: Expected 'EOF', got '#' at position 1091: …003 | /* select#̲1 */ select jso….name’)) AS a->>'$.name' from dev.test_j |
±------±-----±--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

6,JSON_KEYS(json_doc[, path])
返回JSON中一级键值对中key的列表。如果写了path字段,则先进行路径表达式计算,然后的返回第一级键值对中key的列表。

也就是说,不会返回子元素的key。

mysql> SELECT JSON_KEYS(’{“a”: 1, “b”: {“c”: 30}}’);
±--------------------------------------+
| JSON_KEYS(’{“a”: 1, “b”: {“c”: 30}}’) |
±--------------------------------------+
| [“a”, “b”]                            |
±--------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_KEYS(’{“a”: 1, “b”: {“c”: 30}}’, ‘.b′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONKEYS(′"a":1,"b":"c":30′,′.b'); +----------------------------------------------+ | JSON_KEYS('{"a": 1, "b": {"c": 30}}', '.b′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONK​EYS(′"a":1,"b":"c":30′,′.b’) |
±---------------------------------------------+
| [“c”]                                        |
±---------------------------------------------+
1 row in set (0.00 sec)

7,JSON_OVERLAPS(json_doc1, json_doc2)
比较两个JSON是否有相同元素。也就是是否有交集。有则返回1,没有返回0。

部分匹配的情况不能算有相同元素。

两个JSON对象比较时,两者至少有一个相同name的key和相同对应value,则返回1。

两个标量比较时,则比较值是否相等。

标量和数组比较时,则判断标量是否和数组某元素相等。数据类型不同时不算相等。

比如:

mysql> SELECT JSON_OVERLAPS("[1,3,5,7]", “[2,5,7]”);
±--------------------------------------+
| JSON_OVERLAPS("[1,3,5,7]", “[2,5,7]”) |
±--------------------------------------+
|                                     1 |
±--------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_OVERLAPS("[1,3,5,7]", “[2,6,8]”);
±--------------------------------------+
| JSON_OVERLAPS("[1,3,5,7]", “[2,6,8]”) |
±--------------------------------------+
|                                     0 |
±--------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_OVERLAPS(’[[1,2],[3,4],5]’, ‘[1,[2,3],[4,5]]’);
±----------------------------------------------------+
| JSON_OVERLAPS(’[[1,2],[3,4],5]’, ‘[1,[2,3],[4,5]]’) |
±----------------------------------------------------+
|                                                   0 |
±----------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_OVERLAPS(’{“a”:1,“b”:10,“d”:10}’, ‘{“a”:5,“e”:10,“f”:1,“d”:20}’);
±----------------------------------------------------------------------+
| JSON_OVERLAPS(’{“a”:1,“b”:10,“d”:10}’, ‘{“a”:5,“e”:10,“f”:1,“d”:20}’) |
±----------------------------------------------------------------------+
|                                                                     0 |
±----------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_OVERLAPS(’[4,5,“6”,7]’, ‘6’);
±----------------------------------+
| JSON_OVERLAPS(’[4,5,“6”,7]’, ‘6’) |
±----------------------------------+
|                                 0 |
±----------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_OVERLAPS(’[4,5,6,7]’, ‘“6”’);
±----------------------------------+
| JSON_OVERLAPS(’[4,5,6,7]’, ‘“6”’) |
±----------------------------------+
|                                 0 |
±----------------------------------+
1 row in set (0.00 sec)

8,JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] …])
根据某字符串,返回在目标JSON中匹配的value的路径表达式,search_str和JSON中的value相等时算匹配。

此函数能查询子元素信息。

第一个参数json_doc是目标JSON。

第二个参数one_or_all可以选择one或者all。one表示返回一个匹配的值的路径。all表示返回所有路径。

参数search_str是要搜索的字符串。其中可以用%(百分号)代表任意多个字符,_(下划线)代表任意一个字符。

参数escape_char是转义字符。默认是\。写成空字符串或NULL时,也默认为\。

参数path是路径表达式,如果写了path,匹配结果需在路径表达式下进行。

比如:

mysql> SELECT JSON_SEARCH(’[“abc”, [{“k”: “10”}, “def”], {“x”:“abc”}, {“y”:“bcd”}]’, ‘one’, ‘abc’);  
±-------------------------------------------------------------------------------------+
| JSON_SEARCH(’[“abc”, [{“k”: “10”}, “def”], {“x”:“abc”}, {“y”:“bcd”}]’, ‘one’, ‘abc’) |
±-------------------------------------------------------------------------------------+
| “[0]"                                       ∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+1rowinset(0.00sec) mysql>SELECTJSONSEARCH(′["abc",["k":"10","def"],"x":"abc","y":"bcd"]′,′all′,′abc′);  +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONSEARCH(′["abc",["k":"10","def"],"x":"abc","y":"bcd"]′,′all′,′abc′)∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣["[0]"                                                                               | +--------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)   mysql> SELECT JSON_SEARCH('["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]', 'all', 'abc');    +--------------------------------------------------------------------------------------+ | JSON_SEARCH('["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]', 'all', 'abc') | +--------------------------------------------------------------------------------------+ | ["[0]"                                       ∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+1rowinset(0.00sec) mysql>SELECTJSONS​EARCH(′["abc",["k":"10","def"],"x":"abc","y":"bcd"]′,′all′,′abc′);  +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONS​EARCH(′["abc",["k":"10","def"],"x":"abc","y":"bcd"]′,′all′,′abc′)∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣["[0]”, “[2].x"]                                 ∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+1rowinset(0.00sec) mysql>SELECTJSONSEARCH(′["abc",["k":"10","def"],"x":"abc","y":"bcd"]′,′all′,′abcdefg′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONSEARCH(′["abc",["k":"10","def"],"x":"abc","y":"bcd"]′,′all′,′abcdefg′)∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣NULL                                          ∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+1rowinset(0.00sec) mysql>SELECTJSONSEARCH(′["abc",["k":"10","def"],"x":"abc","y":"bcd"]′,′all′,′10′,NULL,′[2].x"]                                                                   | +--------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)   mysql> SELECT JSON_SEARCH('["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]', 'all', 'abcdefg'); +------------------------------------------------------------------------------------------+ | JSON_SEARCH('["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]', 'all', 'abcdefg') | +------------------------------------------------------------------------------------------+ | NULL                                                                                     | +------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)   mysql> SELECT JSON_SEARCH('["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]', 'all', '10', NULL, '[2].x"]                                 ∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+1rowinset(0.00sec) mysql>SELECTJSONS​EARCH(′["abc",["k":"10","def"],"x":"abc","y":"bcd"]′,′all′,′abcdefg′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONS​EARCH(′["abc",["k":"10","def"],"x":"abc","y":"bcd"]′,′all′,′abcdefg′)∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣NULL                                          ∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+1rowinset(0.00sec) mysql>SELECTJSONS​EARCH(′["abc",["k":"10","def"],"x":"abc","y":"bcd"]′,′all′,′10′,NULL,′[1][0].k’);
±-------------------------------------------------------------------------------------------------------+
| JSON_SEARCH(’[“abc”, [{“k”: “10”}, “def”], {“x”:“abc”}, {“y”:“bcd”}]’, ‘all’, ‘10’, NULL, '[1][0].k′)∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣"[1][0].k') | +--------------------------------------------------------------------------------------------------------+ | "[1][0].k′)∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣"[1][0].k”                                                                                            |
±-------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_SEARCH(’[“abc”, [{“k”: “10”}, “def”], {“x”:“abc”}, {“y”:“bcd”}]’, ‘all’, ‘%b%’, NULL, ‘[3]′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONSEARCH(′["abc",["k":"10","def"],"x":"abc","y":"bcd"]′,′all′,′[3]'); +----------------------------------------------------------------------------------------------------+ | JSON_SEARCH('["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]', 'all', '%b%', NULL, '[3]′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONS​EARCH(′["abc",["k":"10","def"],"x":"abc","y":"bcd"]′,′all′,′[3]’) |
±---------------------------------------------------------------------------------------------------+
| “$[3].y”                                                                                           |
±---------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

9,value MEMBER OF(json_array)
判断value是否被包含在某JSON数组中。包含则返回1,否则返回0。

数据格式不同时不算包含。

value可以用其他表达式替代。

JSON格式的字符串不能直接和数组中的JSON对象比较,会返回0,此时需要把value转成JSON类型才能返回1。

mysql> SELECT 17 MEMBER OF(’[23, “abc”, 17, “ab”, 10]’);
±------------------------------------------+
| 17 MEMBER OF(’[23, “abc”, 17, “ab”, 10]’) |
±------------------------------------------+
|                                         1 |
±------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT ‘17’ MEMBER OF(’[23, “abc”, 17, “ab”, 10]’);
±--------------------------------------------+
| ‘17’ MEMBER OF(’[23, “abc”, 17, “ab”, 10]’) |
±--------------------------------------------+
|                                           0 |
±--------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_ARRAY(4,5) MEMBER OF(’[[3,4],[4,5]]’);
±-------------------------------------------+
| JSON_ARRAY(4,5) MEMBER OF(’[[3,4],[4,5]]’) |
±-------------------------------------------+
|                                          1 |
±-------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT ‘{“a”:1}’ MEMBER OF(JSON_ARRAY(17, CAST(’{“a”:1}’ AS JSON), “abc”, 23));
±------------------------------------------------------------------------+
| ‘{“a”:1}’ MEMBER OF(JSON_ARRAY(17, CAST(’{“a”:1}’ AS JSON), “abc”, 23)) |
±------------------------------------------------------------------------+
|                                                                       0 |
±------------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT CAST(’{“a”:1}’ AS JSON) MEMBER OF(JSON_ARRAY(17, CAST(’{“a”:1}’ AS JSON), “abc”, 23));
±--------------------------------------------------------------------------------------+
| CAST(’{“a”:1}’ AS JSON) MEMBER OF(JSON_ARRAY(17, CAST(’{“a”:1}’ AS JSON), “abc”, 23)) |
±--------------------------------------------------------------------------------------+
|                                                                                     1 |
±--------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

三,JSON值的修改
1,JSON_ARRAY_APPEND(json_doc, path, val[, path, val] …)
向JSON数组中追加元素,如果对应位置是单个元素,则和新元素一起封装成数组。

另外,在MySQL8.0中,原来的JSON_APPEND()函数不再使用。

mysql> SELECT JSON_ARRAY_APPEND(’[“a”, [“b”, “c”], “d”]’, ‘[1]′,1);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONARRAYAPPEND(′["a",["b","c"],"d"]′,′[1]', 1); +--------------------------------------------------------+ | JSON_ARRAY_APPEND('["a", ["b", "c"], "d"]', '[1]′,1);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONA​RRAYA​PPEND(′["a",["b","c"],"d"]′,′[1]’, 1) |
±-------------------------------------------------------+
| [“a”, [“b”, “c”, 1], “d”]                              |
±-------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_ARRAY_APPEND(’[“a”, [“b”, “c”], “d”]’, ‘[1][0]′,3); +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONARRAYAPPEND(′["a",["b","c"],"d"]′,′[1][0]', 3);   +-----------------------------------------------------------+ | JSON_ARRAY_APPEND('["a", ["b", "c"], "d"]', '[1][0]′,3); +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONA​RRAYA​PPEND(′["a",["b","c"],"d"]′,′[1][0]’, 3) |
±----------------------------------------------------------+
| [“a”, [[“b”, 3], “c”], “d”]                               |
±----------------------------------------------------------+
1 row in set (0.01 sec)
 
mysql> SELECT JSON_ARRAY_APPEND(’{“a”: 1}’, ‘′,′z′); +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONARRAYAPPEND(′"a":1′,′', 'z');   +-----------------------------------------+ | JSON_ARRAY_APPEND('{"a": 1}', '′,′z′); +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONA​RRAYA​PPEND(′"a":1′,′’, ‘z’) |
±----------------------------------------+
| [{“a”: 1}, “z”]                         |
±----------------------------------------+
1 row in set (0.00 sec)

2,JSON_ARRAY_INSERT(json_doc, path, val[, path, val] …)
在数组的指定位置追加元素,原位置的元素和后面的元素依次向后移一位。

指定位置超过数组上限,则添加在数组最后位置。

注意:在多个位置添加多个元素时,添加是有顺序的,后面添加的元素需要等前面的元素添加成功后重新确认具体位置。

举例:

mysql> SELECT JSON_ARRAY_INSERT(’[“a”, {“b”: [1, 2]}, [3, 4]]’, ‘[1]′,′x′); +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONARRAYINSERT(′["a","b":[1,2],[3,4]]′,′[1]', 'x');   +----------------------------------------------------------------+ | JSON_ARRAY_INSERT('["a", {"b": [1, 2]}, [3, 4]]', '[1]′,′x′); +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONA​RRAYI​NSERT(′["a","b":[1,2],[3,4]]′,′[1]’, ‘x’) |
±---------------------------------------------------------------+
| [“a”, “x”, {“b”: [1, 2]}, [3, 4]]                              |
±---------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_ARRAY_INSERT(’[“a”, {“b”: [1, 2]}, [3, 4]]’, ‘[100]′,′x′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONARRAYINSERT(′["a","b":[1,2],[3,4]]′,′[100]', 'x'); +------------------------------------------------------------------+ | JSON_ARRAY_INSERT('["a", {"b": [1, 2]}, [3, 4]]', '[100]′,′x′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONA​RRAYI​NSERT(′["a","b":[1,2],[3,4]]′,′[100]’, ‘x’) |
±-----------------------------------------------------------------+
| [“a”, {“b”: [1, 2]}, [3, 4], “x”]                                |
±-----------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_ARRAY_INSERT(’[“a”, {“b”: [1, 2]}, [3, 4]]’, ‘[1].b[0]′,′x′);    +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONARRAYINSERT(′["a","b":[1,2],[3,4]]′,′[1].b[0]', 'x');         +---------------------------------------------------------------------+ | JSON_ARRAY_INSERT('["a", {"b": [1, 2]}, [3, 4]]', '[1].b[0]′,′x′);    +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONA​RRAYI​NSERT(′["a","b":[1,2],[3,4]]′,′[1].b[0]’, ‘x’) |
±--------------------------------------------------------------------+
| [“a”, {“b”: [“x”, 1, 2]}, [3, 4]]                                   |
±--------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_ARRAY_INSERT(’[“a”, {“b”: [1, 2]}, [3, 4]]’, ‘[0]′,′x′,′[0]', 'x', '[0]′,′x′,′[2][1]’, ‘y’);  
±-------------------------------------------------------------------------------+
| JSON_ARRAY_INSERT(’[“a”, {“b”: [1, 2]}, [3, 4]]’, ‘[0]′,′x′,′[0]', 'x', '[0]′,′x′,′[2][1]’, ‘y’) |
±-------------------------------------------------------------------------------+
| [“x”, “a”, {“b”: [1, 2]}, [3, 4]]                                              |
±-------------------------------------------------------------------------------+
1 row in set (0.00 sec)
注意最后一个语句,在[0]处添加x,在[0]处添加x,在[0]处添加x,在[2][1]处添加y,但是最后y没有添加成功,本来$[2]代表的应该是[3, 4],但是前面添加了x后,JSON变成了:

[“x”, “a”, {“b”: [1, 2]}, [3, 4]]
于是此时的$[2]变成了{“b”: [1, 2]},是个JSON对象,不是数组,所以无法使用此函数。

以下sql可以验证这个场景:

mysql> SELECT JSON_ARRAY_INSERT(’[“a”, {“b”: [1, 2]}, [3, 4]]’, ‘[0]′,′x′,′[0]', 'x', '[0]′,′x′,′[2].b[1]’, ‘y’);
±---------------------------------------------------------------------------------+
| JSON_ARRAY_INSERT(’[“a”, {“b”: [1, 2]}, [3, 4]]’, ‘[0]′,′x′,′[0]', 'x', '[0]′,′x′,′[2].b[1]’, ‘y’) |
±---------------------------------------------------------------------------------+
| [“x”, “a”, {“b”: [1, “y”, 2]}, [3, 4]]                                           |
±---------------------------------------------------------------------------------+
1 row in set (0.00 sec)
可见添加y的时候$[2]已经是{“b”: [1, 2]}了。

3,JSON_INSERT(json_doc, path, val[, path, val] …)
向JSON添加键值对。

如果添加的key已经存在,则忽略此键值对,不再添加。

mysql> SELECT JSON_INSERT(’{ “a”: 1, “b”: [2, 3]}’, ‘.a′,10,′.a', 10, '.a′,10,′.c’, ‘[true, false]’);      
±-------------------------------------------------------------------------+
| JSON_INSERT(’{ “a”: 1, “b”: [2, 3]}’, ‘.a′,10,′.a', 10, '.a′,10,′.c’, ‘[true, false]’) |
±-------------------------------------------------------------------------+
| {“a”: 1, “b”: [2, 3], “c”: “[true, false]”}                              |
±-------------------------------------------------------------------------+
1 row in set (0.00 sec)
从此结果可以看到,此函数不支持数据类型转换,’[true, false]'参数被当做字符串添加了,如果需要作为JSON数组添加,需要手动转换:

mysql> SELECT JSON_INSERT(’{ “a”: 1, “b”: [2, 3]}’, ‘.a′,10,′.a', 10, '.a′,10,′.c’, CAST(’[true, false]’ AS JSON));
±---------------------------------------------------------------------------------------+
| JSON_INSERT(’{ “a”: 1, “b”: [2, 3]}’, ‘.a′,10,′.a', 10, '.a′,10,′.c’, CAST(’[true, false]’ AS JSON)) |
±---------------------------------------------------------------------------------------+
| {“a”: 1, “b”: [2, 3], “c”: [true, false]}                                              |
±---------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

4,JSON_MERGE(json_doc, json_doc[, json_doc] …)
合并多个JSON,MySQL8.0.3版本已废弃,建议使用JSON_MERGE_PRESERVE()函数。

举例:

mysql> SELECT JSON_MERGE(’[1, 2]’, ‘[true, false]’);
±--------------------------------------+
| JSON_MERGE(’[1, 2]’, ‘[true, false]’) |
±--------------------------------------+
| [1, 2, true, false]                   |
±--------------------------------------+
1 row in set, 1 warning (0.00 sec)
 
mysql> SHOW WARNINGS;
±--------±-----±----------------------------------------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                                                     |
±--------±-----±----------------------------------------------------------------------------------------------------------------------------+
| Warning | 1287 | ‘JSON_MERGE’ is deprecated and will be removed in a future release. Please use JSON_MERGE_PRESERVE/JSON_MERGE_PATCH instead |
±--------±-----±----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

5,JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] …)
合并多个JSON对象。会去重的合并。

合并规则:

1,如果两JSON合并,第一个JSON不是对象(比如标量或数组),则合并的结果是第二个JSON,即使第二个JSON也不是对象。

2,如果两JSON合并,第二个JSON不是对象(比如标量或数组),则合并的结果还是第二个JSON。为什么?这什么道理?

3,如果两个JSON中有相同的key,且value中有非对象,则value保留后面JSON的value。

4,如果两个JSON中有相同的key,且对应的value中都是JSON对象,则两个value递归合并。

5,合并完成后,value是null的键值对会被删掉。可以用这个特性来删除空值键值对,比如用一个标量和想删null值的JSON合并,记得标量放第一位,JSON放第二位。

mysql> SELECT JSON_MERGE_PATCH(’[1, 2]’, ‘[true, false]’);
±--------------------------------------------+
| JSON_MERGE_PATCH(’[1, 2]’, ‘[true, false]’) |
±--------------------------------------------+
| [true, false]                               |
±--------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_MERGE_PATCH(’{“a”:1, “b”:2, “c”:null}’, ‘[]’);
±---------------------------------------------------+
| JSON_MERGE_PATCH(’{“a”:1, “b”:2, “c”:null}’, ‘[]’) |
±---------------------------------------------------+
| []                                                 |
±---------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_MERGE_PATCH(’{ “a”: 1, “b”:2 }’,’{ “a”: 3, “c”:4 }’,’{ “a”: 5, “d”:6 }’);
±------------------------------------------------------------------------------+
| JSON_MERGE_PATCH(’{ “a”: 1, “b”:2 }’,’{ “a”: 3, “c”:4 }’,’{ “a”: 5, “d”:6 }’) |
±------------------------------------------------------------------------------+
| {“a”: 5, “b”: 2, “c”: 4, “d”: 6}                                              |
±------------------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_MERGE_PATCH(’{“a”:{“x”:1}}’, ‘{“a”:{“y”:2}}’);
±---------------------------------------------------+
| JSON_MERGE_PATCH(’{“a”:{“x”:1}}’, ‘{“a”:{“y”:2}}’) |
±---------------------------------------------------+
| {“a”: {“x”: 1, “y”: 2}}                            |
±---------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_MERGE_PATCH(‘1’,’{“a”:1, “b”:2, “c”:null}’);
±-------------------------------------------------+
| JSON_MERGE_PATCH(‘1’,’{“a”:1, “b”:2, “c”:null}’) |
±-------------------------------------------------+
| {“a”: 1, “b”: 2}                                 |
±-------------------------------------------------+
1 row in set (0.00 sec)

6,JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] …)
合并多个JSON。不去重,保留所有值的合并。

合并规则:

1,两数组或两标量合并,合成一个新数组。

2,两对象合并,递归合并成一个新对象。如有同key键值对,则几个value合并成最终的value。

3,对象和数组合并,对象转成单个元素的数组然后合并成一个新数组。

举例:

mysql> SELECT JSON_MERGE_PRESERVE(’[1, 2]’, ‘[true, false]’);
±-----------------------------------------------+
| JSON_MERGE_PRESERVE(’[1, 2]’, ‘[true, false]’) |
±-----------------------------------------------+
| [1, 2, true, false]                            |
±-----------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_MERGE_PRESERVE(’{“name”: “x”}’, ‘{“id”: 47}’);
±---------------------------------------------------+
| JSON_MERGE_PRESERVE(’{“name”: “x”}’, ‘{“id”: 47}’) |
±---------------------------------------------------+
| {“id”: 47, “name”: “x”}                            |
±---------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_MERGE_PRESERVE(’[1, 2]’, ‘{“id”: 47}’);
±--------------------------------------------+
| JSON_MERGE_PRESERVE(’[1, 2]’, ‘{“id”: 47}’) |
±--------------------------------------------+
| [1, 2, {“id”: 47}]                          |
±--------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_MERGE_PRESERVE(’{ “a”: 1, “b”: 2 }’,’{ “a”: 3, “c”: 4 }’,’{ “a”: 5, “d”: 6 }’);
±------------------------------------------------------------------------------------+
| JSON_MERGE_PRESERVE(’{ “a”: 1, “b”: 2 }’,’{ “a”: 3, “c”: 4 }’,’{ “a”: 5, “d”: 6 }’) |
±------------------------------------------------------------------------------------+
| {“a”: [1, 3, 5], “b”: 2, “c”: 4, “d”: 6}                                            |
±------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
感觉这个JSON_MERGE_PRESERVE()函数才是真正的合并,不漏元素。相比之下JSON_MERGE_PATCH()函数的作用更像是去重。

7,JSON_REMOVE(json_doc, path[, path] …)
从JSON中删除对应路径下的元素。

指定路径不存在也不会报错。

mysql> SELECT JSON_REMOVE(’[“a”, [“b”, “c”], “d”]’, ‘[1]′);  +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONREMOVE(′["a",["b","c"],"d"]′,′[1]');    +-----------------------------------------------+ | JSON_REMOVE('["a", ["b", "c"], "d"]', '[1]′);  +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONR​EMOVE(′["a",["b","c"],"d"]′,′[1]’) |
±----------------------------------------------+
| [“a”, “d”]                                    |
±----------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_REMOVE(’[“a”, [“b”, “c”], “d”]’, ‘[9]′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONREMOVE(′["a",["b","c"],"d"]′,′[9]'); +-----------------------------------------------+ | JSON_REMOVE('["a", ["b", "c"], "d"]', '[9]′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONR​EMOVE(′["a",["b","c"],"d"]′,′[9]’) |
±----------------------------------------------+
| [“a”, [“b”, “c”], “d”]                        |
±----------------------------------------------+
1 row in set (0.00 sec)

8,JSON_REPLACE(json_doc, path, val[, path, val] …)
替换JSON中的值。

如果路径不存在,则忽略。

mysql> SELECT JSON_REPLACE(’{ “a”: 1, “b”: [2, 3]}’, ‘.a′,10,′.a', 10, '.a′,10,′.c’, ‘[true, false]’);  
±--------------------------------------------------------------------------+
| JSON_REPLACE(’{ “a”: 1, “b”: [2, 3]}’, ‘.a′,10,′.a', 10, '.a′,10,′.c’, ‘[true, false]’) |
±--------------------------------------------------------------------------+
| {“a”: 10, “b”: [2, 3]}                                                    |
±--------------------------------------------------------------------------+
1 row in set (0.00 sec)

9,JSON_SET(json_doc, path, val[, path, val] …)
替换JSON中的值。

如果路径不存在,则添加该值。

如果修改的是数组,路径超过了数组上限,则把元素添加到数组末尾。

mysql> SELECT JSON_SET(’{ “a”: 1, “b”: [2, 3]}’, ‘.a′,10,′.a', 10, '.a′,10,′.c’, ‘[true, false]’);  
±----------------------------------------------------------------------+
| JSON_SET(’{ “a”: 1, “b”: [2, 3]}’, ‘.a′,10,′.a', 10, '.a′,10,′.c’, ‘[true, false]’) |
±----------------------------------------------------------------------+
| {“a”: 10, “b”: [2, 3], “c”: “[true, false]”}                          |
±----------------------------------------------------------------------+
1 row in set (0.00 sec)
所以,JSON_SET(),JSON_INSERT(),和JSON_REPLACE()三者的区别在于:

JSON_SET():路径存在则替换值,路径不存在则新增。
JSON_INSERT():只负责新增。
JSON_REPLACE():只负责替换已存在的值。

10,JSON_UNQUOTE(json_val)
去掉JSON值的双引号,并返回utf8mb4格式的字符串。

此函数可以识别转义字符。

mysql> SELECT ‘“abc”’, JSON_UNQUOTE(’“abc”’);
±------±----------------------+
| “abc” | JSON_UNQUOTE(’“abc”’) |
±------±----------------------+
| “abc” | abc                   |
±------±----------------------+
1 row in set (0.00 sec)
 
mysql> SELECT ‘[1, 2, 3]’, JSON_UNQUOTE(’[1, 2, 3]’);
±----------±--------------------------+
| [1, 2, 3] | JSON_UNQUOTE(’[1, 2, 3]’) |
±----------±--------------------------+
| [1, 2, 3] | [1, 2, 3]                 |
±----------±--------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_UNQUOTE(’"\t\u0032"’);
±-----------------------------+
| JSON_UNQUOTE(’"\t\u0032"’) |
±-----------------------------+
|       2                           |
±-----------------------------+

四,JSON值的属性
1,JSON_DEPTH(json_doc)
返回JSON值的最大深度。

空数组,空对象,标量的深度为1。

仅包含深度为1的元素的数组或对象的深度为2。

其他情况以此类推。

举例:

mysql> SELECT JSON_DEPTH(’{}’), JSON_DEPTH(’[]’), JSON_DEPTH(‘true’);
±-----------------±-----------------±-------------------+
| JSON_DEPTH(’{}’) | JSON_DEPTH(’[]’) | JSON_DEPTH(‘true’) |
±-----------------±-----------------±-------------------+
|                1 |                1 |                  1 |
±-----------------±-----------------±-------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_DEPTH(’[10, 20]’), JSON_DEPTH(’[[], {}]’);
±-----------------------±-----------------------+
| JSON_DEPTH(’[10, 20]’) | JSON_DEPTH(’[[], {}]’) |
±-----------------------±-----------------------+
|                      2 |                      2 |
±-----------------------±-----------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_DEPTH(’[10, {“a”: 20}]’);
±------------------------------+
| JSON_DEPTH(’[10, {“a”: 20}]’) |
±------------------------------+
|                             3 |
±------------------------------+
1 row in set (0.00 sec)

2,JSON_LENGTH(json_doc[, path])
返回JSON值的长度。如果写了path,返回对应路径下的JSON长度。

标量的长度是1。

数组的长度是元素的数量。

对象的长度是成员数量。

嵌套的数组不会被计算长度。

举例:

mysql> SELECT JSON_LENGTH(’[1, 2, {“a”: 3}]’);
±--------------------------------+
| JSON_LENGTH(’[1, 2, {“a”: 3}]’) |
±--------------------------------+
|                               3 |
±--------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_LENGTH(’{“a”: 1, “b”: {“c”: 30}}’);
±----------------------------------------+
| JSON_LENGTH(’{“a”: 1, “b”: {“c”: 30}}’) |
±----------------------------------------+
|                                       2 |
±----------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_LENGTH(’{“a”: 1, “b”: {“c”: 30}}’, ‘.b′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONLENGTH(′"a":1,"b":"c":30′,′.b'); +------------------------------------------------+ | JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '.b′);+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONL​ENGTH(′"a":1,"b":"c":30′,′.b’) |
±-----------------------------------------------+
|                                              1 |
±-----------------------------------------------+
1 row in set (0.00 sec)

3,JSON_TYPE(json_val)
返回JSON类型。返回值是一个utf8mb4字符串。

可返回的JSON类型有:

OBJECT。JSON对象。
ARRAY。JSON数组。
BOOLEAN。JSON的true或false。
NULL。JSON的null值。这个返回值是大写的。
INTEGER。TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT类型标量。
DOUBLE。DOUBLE和FLOAT类型标量。
DECIMAL。DECIMAL和NUMERIC类型标量。
DATETIME。DATETIME和TIMESTAMP类型标量。
DATE。DATE类型标量。
TIME。TIME类型标量。
STRING。MySQL中utf8格式标量,比如:CHAR,VARCHAR,TEXT,ENUM,SET。
BLOB。MySQL中二进制格式标量,比如:BINARY,VARBINARY,BLOB,BIT。
OPAQUE。raw bits格式。
举例:

mysql> SELECT JSON_TYPE(’{“a”: [10, true]}’);
±-------------------------------+
| JSON_TYPE(’{“a”: [10, true]}’) |
±-------------------------------+
| OBJECT                         |
±-------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_TYPE(JSON_EXTRACT(’{“a”: [10, true]}’, ‘.a[1]′)); +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONTYPE(JSONEXTRACT(′"a":[10,true]′,′.a[1]'));   +--------------------------------------------------------+ | JSON_TYPE(JSON_EXTRACT('{"a": [10, true]}', '.a[1]′)); +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣JSONT​YPE(JSONE​XTRACT(′"a":[10,true]′,′.a[1]’)) |
±-------------------------------------------------------+
| BOOLEAN                                                |
±-------------------------------------------------------+
1 row in set (0.00 sec)

4,JSON_VALID(val)
判断JSON值是否符合JSON规范。符合返回1,不符合返回0。

mysql> SELECT JSON_VALID(’{“a”: 1}’);
±-----------------------+
| JSON_VALID(’{“a”: 1}’) |
±-----------------------+
|                      1 |
±-----------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_VALID(‘hello’), JSON_VALID(’“hello”’);
±--------------------±----------------------+
| JSON_VALID(‘hello’) | JSON_VALID(’“hello”’) |
±--------------------±----------------------+
|                   0 |                     1 |
±--------------------±----------------------+
1 row in set (0.00 sec)

五,JSON临时表函数
JSON临时表函数可以把一个JSON值变成一个临时表,并返回表格的一些信息。

建立临时表的函数如下:

JSON_TABLE(

expr,

path COLUMNS (column_list)

)   [AS] alias

解析一下其中的各个表达式:

1,expr是JSON值。可以是个常量,比如’{“a”:1}’。可以是一列值,比如t1.json_data,t1是之前定义的JSON临时表。可以是返回JSON值的函数,比如:JSON_EXTRACT(t1,jsn_data,’$.post.comments’)。

2,path是路径表达式,JSON值要先经过路径表达式的筛选。

3,alias是临时表的表名。AS可以不写。

4,COLUMNS是临时表的列。当列中用到path路径时,$从父级路径表达式继承,属于相对路径。

COLUMNS的单个元素都可以有以下选择:

1),name FOR ORDINALITY

此列代表行号。name是自定义列名。此列内容是一个自增的计数器,类型是unsigned int,初始为1。类似MySQL的自增id。如果列中包含NESTED PATH语句,会把一行拆成多行,此时这些行的行号都是一样的,也就是第一级行的行号。

2),name type PATH string_path [on_empty] [on_error]

此列表示按照路径表达式查询JSON中的值。name是列名。type是要求返回的数据格式。string_path是路径表达式。

[on_empty]用于路径表达式值不存在的时候的默认值。

[on_empty]可选的写法有:

NULL ON EMPTY。显示为NULL,此为默认方式。

ERROR ON EMPTY。显示为ERROR。

DEFAULT json_string ON EMPTY。显示一个默认的JSON值。

[on_error]用于路径表达式下报错的时候的默认值。报错的场景比如保存时的精度错误,格式错误等。

[on_error]可选的写法有:

NULL ON ERROR。显示为NULL,此为默认方式。

ERROR ON ERROR。显示为ERROR。

DEFAULT json_string ON ERROR。显示一个默认的JSON值。

下面是一个使用ON EMPTY和ON ERROR的例子:

mysql>  SELECT *
    ->  FROM
    ->    JSON_TABLE(
    ->      ‘[{“a”:“3”},{“a”:2},{“b”:1},{“a”:0},{“a”:[1,2]}]’,
    ->      “[∗]"  −>   COLUMNS(  −>    rowidFORORDINALITY,  −>    acVARCHAR(100)PATH"[*]"     ->      COLUMNS(     ->        rowid FOR ORDINALITY,     ->        ac VARCHAR(100) PATH "[∗]"  −>   COLUMNS(  −>    rowidFORORDINALITY,  −>    acVARCHAR(100)PATH".a” DEFAULT ‘111’ ON EMPTY DEFAULT ‘999’ ON ERROR
    ->      )
    ->    ) AS tt;
±------±-----+
| rowid | ac   |
±------±-----+
|     1 | 3    |
|     2 | 2    |
|     3 | 111  |
|     4 | 0    |
|     5 | 999  |
±------±-----+
5 rows in set (0.01 sec)
可见,第3行从{“b”:1}获取"$.a"时不存在,显示的是ON EMPTY的默认值111。

第5行从{“a”:[1,2]}获取"$.a"时得到了数组,而不是列中定义的VARCHAR(100),类型错误,显示的是ON ERROR默认的999。

3),name type EXISTS PATH path

指定路径下的值是否存在。存在返回1,不存在返回0。

4),NESTED [PATH] path COLUMNS (column_list)

将JSON中嵌套结构的JSON对象或数组元素拆成单独的行。

[PATH]关键字可以不写。

column_list可以写多个,可写的内容和临时表函数可用的column_list一样,name FOR ORDINALITY之类的都可以写。

对于同一元素中的PATH和NESTED PATH,得到的结果类似一个内连接。

如果存在多个NESTED PATH,则会对每个NESTED PATH单独生成一组记录,不会用连接的形式展示。

举例:

mysql> SELECT *
    -> FROM
    ->   JSON_TABLE(
    ->     ‘[ {“a”: 1, “b”: [11,111]}, {“a”: 2, “b”: [22,222]}, {“a”:3}]’,
    ->     ‘[∗]′COLUMNS(  −>      idFORORDINALITY,  −>      aINTPATH′[*]' COLUMNS(     ->             id FOR ORDINALITY,     ->             a INT PATH '[∗]′COLUMNS(  −>      idFORORDINALITY,  −>      aINTPATH′.a’,
    ->             NESTED PATH ‘.b[∗]′COLUMNS(bINTPATH′.b[*]' COLUMNS (b INT PATH '.b[∗]′COLUMNS(bINTPATH′’)
    ->            )
    ->    ) AS jt
    -> WHERE b IS NOT NULL;
±-----±-----±-----+
| id   | a    | b    |
±-----±-----±-----+
|    1 |    1 |   11 |
|    1 |    1 |  111 |
|    2 |    2 |   22 |
|    2 |    2 |  222 |
±-----±-----±-----+
4 rows in set (0.00 sec)
可以看到,前两行id都是1,他们都是从数组的第一个元素{“a”: 1, “b”: [11,111]}得来的,这两行的a列和b列就类似’.a′和′.a'和'.a′和′.b[*]'的一个内连接。

再比如:

mysql> SELECT *
    -> FROM
    ->   JSON_TABLE(
    ->     ‘[{“a”: 1, “b”: [11,111]}, {“a”: 2, “b”: [22,222,2222]}]’,
    ->     ‘[∗]′COLUMNS(  −>    aINTPATH′[*]' COLUMNS(     ->         a INT PATH '[∗]′COLUMNS(  −>    aINTPATH′.a’,
    ->         NESTED PATH ‘.b[∗]′COLUMNS(b1INTPATH′.b[*]' COLUMNS (b1 INT PATH '.b[∗]′COLUMNS(b1INTPATH′’),
    ->         NESTED PATH ‘.b[∗]′COLUMNS(b2INTPATH′.b[*]' COLUMNS (b2 INT PATH '.b[∗]′COLUMNS(b2INTPATH′’)
    ->     )
    -> ) AS jt;
±-----±-----±-----+
| a    | b1   | b2   |
±-----±-----±-----+
|    1 |   11 | NULL |
|    1 |  111 | NULL |
|    1 | NULL |   11 |
|    1 | NULL |  111 |
|    2 |   22 | NULL |
|    2 |  222 | NULL |
|    2 | 2222 | NULL |
|    2 | NULL |   22 |
|    2 | NULL |  222 |
|    2 | NULL | 2222 |
±-----±-----±-----+
10 rows in set (0.00 sec)
可以看到,前4条数据是由{“a”: 1, “b”: [11,111]}得来的,b1和b2列理论上能获得11和111两个值,但是查询结果给b1和b2分别生成了2条记录。后6条数据是由{“a”: 2, “b”: [22,222,2222]}得来的,b1和b2列能获得22,222,2222三个值,但是查询结果给b1和b2分别生成了3条记录。

稍微复杂一点的情况:

mysql> SELECT *
    -> FROM
    ->   JSON_TABLE(
    ->     '[{“a”: “a_val”,
    '>       “b”: [{“c”: “c_val”, “l”: [1,2]}]},
    '>     {“a”: “a_val”,
    ‘>       “b”: [{“c”: “c_val”,“l”: [11]}, {“c”: “c_val”, “l”: [22]}]}]’,
    ->     ‘[∗]′COLUMNS(  −>   topordFORORDINALITY,  −>   apathVARCHAR(10)PATH′[*]' COLUMNS(     ->       top_ord FOR ORDINALITY,     ->       apath VARCHAR(10) PATH '[∗]′COLUMNS(  −>   topo​rdFORORDINALITY,  −>   apathVARCHAR(10)PATH′.a’,
    ->       NESTED PATH ‘.b[∗]′COLUMNS(  −>    bpathVARCHAR(10)PATH′.b[*]' COLUMNS (     ->         bpath VARCHAR(10) PATH '.b[∗]′COLUMNS(  −>    bpathVARCHAR(10)PATH′.c’,
    ->         ord FOR ORDINALITY,
    ->         NESTED PATH ‘.l[∗]′COLUMNS(lpathvarchar(10)PATH′.l[*]' COLUMNS (lpath varchar(10) PATH '.l[∗]′COLUMNS(lpathvarchar(10)PATH′’)
    ->         )
    ->     )
    -> ) as jt;
±--------±------±------±-----±------+
| top_ord | apath | bpath | ord  | lpath |
±--------±------±------±-----±------+
|       1 | a_val | c_val |    1 | 1     |
|       1 | a_val | c_val |    1 | 2     |
|       2 | a_val | c_val |    1 | 11    |
|       2 | a_val | c_val |    2 | 22    |
±--------±------±------±-----±------+
4 rows in set (0.00 sec)

六,JSON格式校验
1,JSON_SCHEMA_VALID(schema,document)
校验document文档是否符合schema定义的JSON规则。

document和schema必须都是标准的JSON格式。

schema中的require参数表示必须要有的key。

假如定义一个schema:

mysql> SET @schema = '{
    '>  “id”: “http://json-schema.org/geo”,
    '>  “$schema”: “http://json-schema.org/draft-04/schema#”,
    '>  “description”: “A geographical coordinate”,
    '>  “type”: “object”,
    '>  “properties”: {
    '>   “latitude”: {
    '>     “type”: “number”,
    '>     “minimum”: -90,
    '>     “maximum”: 90
    '>   },
    '>   “longitude”: {
    '>     “type”: “number”,
    '>     “minimum”: -180,
    '>     “maximum”: 180
    '>   }
    '>  },
    '>  “required”: [“latitude”, “longitude”]
    ‘> }’;
Query OK, 0 rows affected (0.00 sec)
然后定义document:

mysql> SET @document = '{
    '>  “latitude”: 63.444697,
    '>  “longitude”: 10.445118
    ‘> }’;
Query OK, 0 rows affected (0.00 sec)
最后用JSON_SCHEMA_VALID(schema,document)函数来校验:

mysql> SELECT JSON_SCHEMA_VALID(@schema, @document);
±--------------------------------------+
| JSON_SCHEMA_VALID(@schema, @document) |
±--------------------------------------+
|                                     1 |
±--------------------------------------+
1 row in set (0.00 sec)
返回1即为符合schema定义的规范。

下面把document改成空的:

mysql> SET @document = ‘{}’;
Query OK, 0 rows affected (0.00 sec)
再校验一下:

mysql> SELECT JSON_SCHEMA_VALID(@schema, @document);
±--------------------------------------+
| JSON_SCHEMA_VALID(@schema, @document) |
±--------------------------------------+
|                                     0 |
±--------------------------------------+
1 row in set (0.00 sec)
返回0表示校验失败。

2,JSON_SCHEMA_VALIDATION_REPORT(schema,document)
校验document文档是否符合schema定义的JSON规则,并返回JSON格式的校验报告。

如果校验成功,则返回:{“valid”: true}。

如果校验失败,则返回的校验报告中会包含以下内容:

valid。校验失败则为false。
reason。失败原因。
schema-location。校验失败的节点在schema中的位置。
document-location。校验失败的节点在document中的位置。
schema-failed-keyword。包含校验失败节点的一段schema的关键字。
一个校验失败的场景:

mysql> SET @schema = '{
    '>  “id”: “http://json-schema.org/geo”,
    '> “$schema”: “http://json-schema.org/draft-04/schema#”,
    '> “description”: “A geographical coordinate”,
    '> “type”: “object”,
    '> “properties”: {
    '>   “latitude”: {
    '>     “type”: “number”,
    '>     “minimum”: -90,
    '>     “maximum”: 90
    '>   },
    '>   “longitude”: {
    '>     “type”: “number”,
    '>     “minimum”: -180,
    '>     “maximum”: 180
    '>   }
    '> },
    '> “required”: [“latitude”, “longitude”]
    ‘> }’;
Query OK, 0 rows affected (0.00 sec)
 
mysql> SET @document = '{
    '> “latitude”: 63.444697,
    '> “longitude”: 310.445118
    ‘> }’;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT JSON_PRETTY(JSON_SCHEMA_VALIDATION_REPORT(@schema, @document));
±--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| JSON_PRETTY(JSON_SCHEMA_VALIDATION_REPORT(@schema, @document))                                                                                                                                                                                                                        |
±--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| {
  “valid”: false,
  “reason”: “The JSON document location ‘#/longitude’ failed requirement ‘maximum’ at JSON Schema location ‘#/properties/longitude’”,
  “schema-location”: “#/properties/longitude”,
  “document-location”: “#/longitude”,
  “schema-failed-keyword”: “maximum”
} |
±--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
JSON_PRETTY()函数的作用是让返回的结果格式更好看一些,否则是一行显示。

七,JSON辅助函数
1,JSON_PRETTY(json_val)
格式化JSON值,让输出更好看一些。

参数必须是JSON值或者是符合JSON格式的字符串。

举例:

mysql> SELECT JSON_PRETTY(’[“a”,1,{“key1”:
    ‘>    “value1”},“5”,     “77” ,
    ‘>       {“key2”:[“value3”,“valueX”,
    ‘> “valueY”]},“j”, “2”   ]’);
±------------------------------------------------------------------------------------------------------------------------------------------------------+
| JSON_PRETTY(’[“a”,1,{“key1”:
   “value1”},“5”,     “77” ,
      {“key2”:[“value3”,“valueX”,
“valueY”]},“j”, “2”   ]’)                                 |
±------------------------------------------------------------------------------------------------------------------------------------------------------+
| [
  “a”,
  1,
  {
    “key1”: “value1”
  },
  “5”,
  “77”,
  {
    “key2”: [
      “value3”,
      “valueX”,
      “valueY”
    ]
  },
  “j”,
  “2”
] |
±------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

2,JSON_STORAGE_FREE(json_val)
此函数的功能是,在使用JSON_SET(),JSON_REPLACE(),JSON_REMOVE()函数修改了列值之后,JSON释放了多少空间。

多次使用这三个函数修改列值,此函数返回值会累加。

不使用这三个函数修改列值时,比如直接用set关键字修改列值,则此函数返回0。

只对修改表中存储JSON值的场景有效,如果用三个函数修改用户变量,此函数返回值依然是0。

参数是JSON字符串,返回值会是0。

比如:

mysql> select * from test_j;
±---------------------------------------------+
| a                                            |
±---------------------------------------------+
| {“a”: 10, “b”: “wxyz”, “c”: “[true, false]”} |
±---------------------------------------------+
1 row in set (0.00 sec)
 
mysql> update test_j SET a = JSON_SET(a, “.a",10,".a", 10, ".a",10,".b”, “wxyz”, “.c",1);    QueryOK,1rowaffected(0.00sec)Rowsmatched:1 Changed:1 Warnings:0 mysql>select∗fromtestj;+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣a               ∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣"a":10,"b":"wxyz","c":1∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+1rowinset(0.00sec) mysql>SELECTJSONSTORAGEFREE(a)FROMtestj;+−−−−−−−−−−−−−−−−−−−−−−+∣JSONSTORAGEFREE(a)∣+−−−−−−−−−−−−−−−−−−−−−−+∣         14∣+−−−−−−−−−−−−−−−−−−−−−−+1rowinset(0.00sec) mysql> updatetestjSETa=JSONSET(a,".c", 1);         Query OK, 1 row affected (0.00 sec) Rows matched: 1  Changed: 1  Warnings: 0   mysql> select * from test_j; +--------------------------------+ | a                              | +--------------------------------+ | {"a": 10, "b": "wxyz", "c": 1} | +--------------------------------+ 1 row in set (0.00 sec)   mysql> SELECT JSON_STORAGE_FREE(a) FROM test_j; +----------------------+ | JSON_STORAGE_FREE(a) | +----------------------+ |                   14 | +----------------------+ 1 row in set (0.00 sec)   mysql>  update test_j SET a = JSON_SET(a, ".c",1);    QueryOK,1rowaffected(0.00sec)Rowsmatched:1 Changed:1 Warnings:0 mysql>select∗fromtestj​;+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣a               ∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+∣"a":10,"b":"wxyz","c":1∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+1rowinset(0.00sec) mysql>SELECTJSONS​TORAGEF​REE(a)FROMtestj​;+−−−−−−−−−−−−−−−−−−−−−−+∣JSONS​TORAGEF​REE(a)∣+−−−−−−−−−−−−−−−−−−−−−−+∣         14∣+−−−−−−−−−−−−−−−−−−−−−−+1rowinset(0.00sec) mysql> updatetestj​SETa=JSONS​ET(a,".a”, 10, “.b","wx",".b", "wx", ".b","wx",".c”, 1);   
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
 
mysql> SELECT JSON_STORAGE_FREE(a) FROM test_j;
±---------------------+
| JSON_STORAGE_FREE(a) |
±---------------------+
|                   16 |
±---------------------+
1 row in set (0.00 sec)
 
mysql> update test_j set a = ‘{“a”: 10, “b”: “wx”}’;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
 
mysql> SELECT JSON_STORAGE_FREE(a) FROM test_j; 
±---------------------+
| JSON_STORAGE_FREE(a) |
±---------------------+
|                    0 |
±---------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_STORAGE_FREE(’{“a”: 10, “b”: “wxyz”, “c”: “1”}’);
±------------------------------------------------------+
| JSON_STORAGE_FREE(’{“a”: 10, “b”: “wxyz”, “c”: “1”}’) |
±------------------------------------------------------+
|                                                     0 |
±------------------------------------------------------+
1 row in set (0.00 sec)

3,JSON_STORAGE_SIZE(json_val)
此函数返回的是一个JSON值转换成二进制后占用的磁盘空间。

如果参数是一个JSON格式的列,则表示此列的JSON值转换成二进制后占用的磁盘空间。

如果参数是一个JSON格式的字符串,则表示此字符串代表的JSON值转换成二进制后会占用的磁盘空间。

JSON_SET(),JSON_REPLACE(),JSON_REMOVE()三个函数会部分更新JSON值,不会导致此函数的返回值发生变化。直接用set关键字修改列值会导致此函数返回值发生变化。

因为用户变量不能部分修改,所以当修改用户变量时,此函数的返回值会立刻变化。

举例:

mysql> select * from test_j;
±----------------------------------------------+
| a                                             |
±----------------------------------------------+
| {“a”: 1000, “b”: “wxyz”, “c”: “[1, 3, 5, 7]”} |
±----------------------------------------------+
1 row in set (0.00 sec)
 
mysql> select 
    ->   a,
    ->   JSON_STORAGE_SIZE(a) AS Size,
    ->   JSON_STORAGE_FREE(a) AS Free
    -> from test_j;
±----------------------------------------------±-----±-----+
| a                                             | Size | Free |
±----------------------------------------------±-----±-----+
| {“a”: 1000, “b”: “wxyz”, “c”: “[1, 3, 5, 7]”} |   47 |    0 |
±----------------------------------------------±-----±-----+
1 row in set (0.00 sec)
 
mysql> UPDATE test_j SET a = JSON_SET(a, ".b","a");    QueryOK,1rowaffected(0.01sec)Rowsmatched:1 Changed:1 Warnings:0 mysql>select   −> a,  −> JSONSTORAGESIZE(a)ASSize,  −> JSONSTORAGEFREE(a)ASFree  −>fromtestj;+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+−−−−−−+∣a                     ∣Size∣Free∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+−−−−−−+∣"a":1000,"b":"a","c":"[1,3,5,7]"∣ 47∣  3∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+−−−−−−+1rowinset(0.00sec) mysql>updatetestjseta=′"a":4.55,"b":"wxyz","c":"[true,false]"′;QueryOK,1rowaffected(0.01sec)Rowsmatched:1 Changed:1 Warnings:0 mysql>select   −> a,  −> JSONSTORAGESIZE(a)ASSize,  −> JSONSTORAGEFREE(a)ASFree  −>fromtestj;+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+−−−−−−+∣a                       ∣Size∣Free∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+−−−−−−+∣"a":4.55,"b":"wxyz","c":"[true,false]"∣ 56∣  0∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+−−−−−−+1rowinset(0.00sec) mysql>SET@j=′[100,"sakila",[1,3,5],425.05]′;QueryOK,0rowsaffected(0.00sec) mysql>SELECT@j,JSONSTORAGESIZE(@j)ASSize;+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+∣@j                ∣Size∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+∣[100,"sakila",[1,3,5],425.05]∣ 45∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+1rowinset(0.01sec) mysql>SET@j=JSONSET(@j,′.b", "a");         Query OK, 1 row affected (0.01 sec) Rows matched: 1  Changed: 1  Warnings: 0   mysql> select      ->   a,     ->   JSON_STORAGE_SIZE(a) AS Size,     ->   JSON_STORAGE_FREE(a) AS Free     -> from test_j; +--------------------------------------------+------+------+ | a                                          | Size | Free | +--------------------------------------------+------+------+ | {"a": 1000, "b": "a", "c": "[1, 3, 5, 7]"} |   47 |    3 | +--------------------------------------------+------+------+ 1 row in set (0.00 sec)   mysql> update test_j set a = '{"a": 4.55, "b": "wxyz", "c": "[true, false]"}'; Query OK, 1 row affected (0.01 sec) Rows matched: 1  Changed: 1  Warnings: 0   mysql> select      ->   a,     ->   JSON_STORAGE_SIZE(a) AS Size,     ->   JSON_STORAGE_FREE(a) AS Free     -> from test_j; +------------------------------------------------+------+------+ | a                                              | Size | Free | +------------------------------------------------+------+------+ | {"a": 4.55, "b": "wxyz", "c": "[true, false]"} |   56 |    0 | +------------------------------------------------+------+------+ 1 row in set (0.00 sec)   mysql> SET @j = '[100, "sakila", [1, 3, 5], 425.05]'; Query OK, 0 rows affected (0.00 sec)   mysql> SELECT @j, JSON_STORAGE_SIZE(@j) AS Size; +------------------------------------+------+ | @j                                 | Size | +------------------------------------+------+ | [100, "sakila", [1, 3, 5], 425.05] |   45 | +------------------------------------+------+ 1 row in set (0.01 sec)   mysql> SET @j = JSON_SET(@j, '.b","a");    QueryOK,1rowaffected(0.01sec)Rowsmatched:1 Changed:1 Warnings:0 mysql>select   −> a,  −> JSONS​TORAGES​IZE(a)ASSize,  −> JSONS​TORAGEF​REE(a)ASFree  −>fromtestj​;+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+−−−−−−+∣a                     ∣Size∣Free∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+−−−−−−+∣"a":1000,"b":"a","c":"[1,3,5,7]"∣ 47∣  3∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+−−−−−−+1rowinset(0.00sec) mysql>updatetestj​seta=′"a":4.55,"b":"wxyz","c":"[true,false]"′;QueryOK,1rowaffected(0.01sec)Rowsmatched:1 Changed:1 Warnings:0 mysql>select   −> a,  −> JSONS​TORAGES​IZE(a)ASSize,  −> JSONS​TORAGEF​REE(a)ASFree  −>fromtestj​;+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+−−−−−−+∣a                       ∣Size∣Free∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+−−−−−−+∣"a":4.55,"b":"wxyz","c":"[true,false]"∣ 56∣  0∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+−−−−−−+1rowinset(0.00sec) mysql>SET@j=′[100,"sakila",[1,3,5],425.05]′;QueryOK,0rowsaffected(0.00sec) mysql>SELECT@j,JSONS​TORAGES​IZE(@j)ASSize;+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+∣@j                ∣Size∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+∣[100,"sakila",[1,3,5],425.05]∣ 45∣+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+1rowinset(0.01sec) mysql>SET@j=JSONS​ET(@j,′[1]’, “json”);
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT @j, JSON_STORAGE_SIZE(@j) AS Size;
±---------------------------------±-----+
| @j                               | Size |
±---------------------------------±-----+
| [100, “json”, [1, 3, 5], 425.05] |   43 |
±---------------------------------±-----+
1 row in set (0.00 sec)
 
mysql> SELECT
    ->     JSON_STORAGE_SIZE(’[100, “sakila”, [1, 3, 5], 425.05]’) AS A,
    ->     JSON_STORAGE_SIZE(’{“a”: 1000, “b”: “a”, “c”: “[1, 3, 5, 7]”}’) AS B,
    ->     JSON_STORAGE_SIZE(’{“a”: 1000, “b”: “wxyz”, “c”: “[1, 3, 5, 7]”}’) AS C,
    ->     JSON_STORAGE_SIZE(’[100, “json”, [[10, 20, 30], 3, 5], 425.05]’) AS D;
±—±---±—±---+
| A  | B  | C  | D  |
±—±---±—±---+
| 45 | 44 | 47 | 56 |
±—±---±—±---+
1 row in set (0.00 sec)

MySQL JSON 常用函数 MySQL 提供了丰富的函数对 JSON 类型执行操作,详见。 阅读详情

相关推荐

MySQL中常用的 JSON查询函数

在当今的软件开发中,数据的存储和处理变得越来越多样化。MySQL 作为一款广泛使用的关系型数据库,从 5.7 版本开始引入了对 JSON 数据类型的支持,这使得开发者能够在关系型数据库中高效地存储和处理半结构化数据。和这三个核心函数,就像是三把利刃,为我们在 MySQL 中处理 JSON 数据提供了强大的支持。函数用于检查一个 JSON 文档是否包含另一个指定的 JSON 文档。如果包含,则返回1;否则返回0。函数用于去除 JSON 字符串中的引号。

小李同学的博客 1910

mysql:列类型之json

环境: window10 vs2022 .net 6 mysql 8.0.25 DBeaver 1. 认识json格式 json全称是: JavaScript Object Notation。它的格式有以下几点: 两个对象类型([] or {}); 四种标量 (string、number、true/false、null); 根节点是对象或者是数组; 标量:true/false和null均全为小写形式; 标量:string可以有转移字符("、\、/、\b、\f、\n、\r、\t、\u0000); js

火焰 4844

大连海事大学课设题目/基于LM331的频率电压转换器

部分基于LM331的频压转换的实物连接问题

2301_76649592的博客 3227

MySQL之JSON数据类型

MySQL之JSON函数的基本操作

s12345665432的博客 3339

AVL-Excite新手必看:5步搞定发动机阀系系统建模(附B站视频教程)

本文为AVL-Excite新手提供发动机阀系系统建模的5步详细指南,涵盖软件环境搭建、基本结构建立、关键参数设置、仿真分析及常见问题排查。通过清晰的步骤说明和实用技巧,帮助工程师快速掌握建模方法,并附有精选B站视频教程链接,便于实践学习。

weixin_29305313的博客 509

鸿蒙OS开机动画背后的秘密:从代码到视觉的完整解析(附源码分析)

本文深入解析了鸿蒙OS开机动画的系统级实现原理。从bootanimation服务的启动配置、与Render Service的协同,到基于VSync信号的帧率同步与绘制流水线,结合OpenHarmony源码进行了逐行解读。文章揭示了其事件驱动的优雅退出机制,并探讨了视频支持、多屏适配等高级特性与定制化可能,为开发者理解鸿蒙图形子系统提供了硬核技术视角。

sony5的博客 972

MySQL JSON数据类型全解析(JSON datatype and functions)

JSON(JavaScript Object Notation)是一种常见的信息交换格式,其简单易读且非常适合程序处理。MySQL从5.7版本开始支持JSON数据类型,本文对MySQL中JSON数据类型的使用进行一个总结。

最简单的方法,解决最实际的问题。 1万+

【逆向实战】Unity游戏资源提取与解密全攻略:从AssetBundle到libil2cpp.so的破解技巧

本文详细介绍了Unity游戏资源提取与解密的完整流程,涵盖从AssetBundle到libil2cpp.so的破解技巧。通过AssetStudio和Il2CppDumper等工具,读者可以学习如何提取未加密资源、处理加密文件,并掌握动态dump技术。文章还提供了自动化脚本编写和常见问题解决方案,帮助逆向工程爱好者高效完成资源提取任务。

weixin_29012765的博客 1048

mysql处理json格式的字段,一文搞懂mysql解析json数据

JSON 数据类型是 MySQL 5.7.8 开始支持的。在此之前,只能通过字符类型(CHAR,VARCHAR 或 TEXT )来保存 JSON 文档。 MySQL 8.0版本中增加了对JSON类型的索引支持。可以使用CREATE INDEX语句创建JSON类型的索引,提高JSON类型数据的查询效率。 存储JSON文档所需的空间与存储LONGBLOB或LONGTEXT所需的空间大致相同。 在MySQL 8.0.13之前,JSON列不能有非空的默认值。 JSON 类型比较适合存储一些列不固定、修改较少

秃了也弱了 3万+

4.1 AI Agent对比分析:Coze、Dify、LangGraph,如何选择Agent框架

本文对比分析了三大主流AI Agent框架:Coze(字节跳动平台,可视化开发,适合快速企业应用)、Dify(开源企业级方案,支持定制部署)和LangGraph(代码开发灵活,适合复杂需求)。选择指南建议:需要快速开发选Coze,需开源定制选Dify,复杂灵活需求选LangGraph。核心要点包括理解各框架特点、根据需求评估选择,并提供了实践建议。下节将介绍Coze平台的实战应用。

yonggeit的博客 3145

Python 爬虫实战:Twitter 数据定向抓取(特定话题 + 用户推文爬取与分析)

在社交媒体研究、舆情监测和市场分析等领域,Twitter 数据具有极高的价值。本文将详细介绍如何使用 Python 构建一个完整的 Twitter 数据爬取系统,包括特定话题和用户推文的爬取与分析。我们将涵盖从认证到数据存储、清洗、分析和可视化的全流程。

u014481728的博客 1038

MYSQL JSON数据类型详解

与在字符数据类型中存储json数据相比,原生JSON数据类型提供了自动的格式验证以及优化的存储格式,可以快速访问文档中的元素节点。规范定义)数据类型,可以更加高效的存储和管理JSON文档。从MySQL 5.7.8开始支持原生JSON(

qq_59372626的博客 4386

Allegro如何画Photoplot_Outline操作指导

在用Allegro进行PCB设计的时候,最后进行光绘输出前,Photoplot_Outline是必备一个图形,所有在Photoplot_Outline中的图形将被输出,Photoplot_Outline以外的图形都将不被输出。如何绘制Photoplot_Outline,具体操作如下。如何画Photoplot_Outline操作指导。

weixin_54787054的博客 2635

MySQL8.0新特性学习笔记(五):JSON格式简介和JSON函数详解

目录 JSON格式简介 定义用户变量 JSON格式的规范化 JSON的路径表达式 JSON的比较和排序 JSON的函数 一,创建JSON格式数据 1,JSON_ARRAY([val[, val] ...]) 2,JSON_OBJECT([key, val[, key, val] ...]) 3,JSON_QUOTE(string) 二,JSON的查询 1,JSON_CONT...

lkforce 2万+

51-14 Retentive Network,RetNet 多尺度保留机制序列建模论文精读

RetNet 提出了多尺度保留机制序列建模,该机制支持三种计算范式,即并行、循环和分块循环。RetNet有更好的全局注意力建模、高效的计算效率、对遮挡的鲁棒性、支持基于注意力的图像生成、与置信度相关的门控机制和多任务学习等特点,对不同视觉任务可以共享历史注意力记忆,可以同时进行分类、分割、检测等任务。RetNet在视觉领域应该有广阔的应用前景。

AIgraphX 1614

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Mysql当中Json相关的函数详解

从5.7开始,MySQL开始支持json类型,用于存储JSON数据。提供数据类型的同时也提供了很多关于json的函数供我们使用,本篇文章基本上都来源于官网;

怪咖@的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

mysql的json函数

mysql5.7以上提供了一种新的字段格式json,大概是mysql想把非关系型和关系型数据库一口通吃,所以推出了这种非常好用的格式,这样,我们的很多基于mongoDb或者clickHouse的业务都可以用mysql去实现了。当然了,5.7的版本只是最基础的版本,对于海量数据的效率是远远不够的,不过这些都在mysql8.0解决了。今天我们就针对mysql的json数据格式操作做一个简单的介绍 JSON 数组包含由逗号分隔并包含在[和] 字符中的值列表: ["abc", 10, null, true, fal

qq_39726798的博客 7184

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Mysql】mysql处理json格式字段

mysql处理json格式的字段,一文搞懂mysql解析json数据

闲时不要多想 3481

mysql 操作json格式数据

11.6 JSON数据类型 创建JSON值 JSON值的规范化,合并和自动包装 搜索和修改JSON值 JSON路径语法 JSON值的比较和排序 在JSON和非JSON值之间转换 JSON值的聚合 从MySQL 5.7.8开始,MySQL支持RFC 7159JSON 定义的本机数据类型 ,可以高效访问JSON(JavaScri...

第一桶金的博客 7013

MYSQL JSON 函数

MYSQL JSON函数 json API

程小明的博客 8900

MySQL常用Json函数

来源:http://www.cnblogs.com/waterystone/p/5626098.html; 1. 概述 MySQL里的json分为json array和json object。 $表示整个json对象,在索引数据时用下标(对于json array,从0开始)或键值(对于json object,含有特殊字符的key要用"括起来,比如$."my name")。 例如:[3,...

飞龙在天 3万+

MySQL 将json转为行,JSON_TABLE函数详解

`JSON_TABLE` 是 MySQL 8.0 引入的一个强大函数,它用于将 JSON 数据转换为关系表的格式。通过 `JSON_TABLE` 函数,可以将 JSON 文档解析为关系表的列和行,使得在 SQL 查询中处理 JSON 数据更加方便。

常备不懈 4317

MySQL 中的 JSON_CONTAINS 函数详解

在处理 MySQL 中的 JSON 数据时,我们经常需要检查一个 JSON 文档是否包含特定的值。这时,JSON_CONTAINS 函数就显得非常有用。JSON_CONTAINS 是 MySQL 提供的一个 JSON 函数,用于测试一个 JSON 文档是否包含特定的值。如果包含则返回 1,否则返回 0。target: 待搜索的目标 JSON 文档。candidate: 在目标 JSON 文档中要搜索的值。path(可选): 路径表达式,指示在哪里搜索候选值。

mcband的博客 1万+

MySQL 的 JSON 路径格式

MySQL 使用特定的 JSON 路径表达式语法来导航和提取 JSON 文档中的数据。

kfashfasf的博客 846

Mysql存储json格式数据需要掌握的

最近做的一个 填报项目,由于填报的字段比较多于是便在数据库当中使用了longtext类型的字段直接存储json数据。为什么选择直接存储json数据?业务比较复杂,涉及到很多 一对多 的多表关联,假如拆分存到各个业务表,那么每次查询修改是非常繁琐的,存储json一张表即可解决。字段全部由前端来定,减少了前后端联调时间。避免填报内容需求频繁调整而不断修改数据库结构,比如加字段,减字段这些都是经常有的事,完全可以让前端全权负责,你存什么我就给你返回什么。但是这里我也是有一点好奇,既然存储为json。

怪咖@的博客 8862
上一篇: mysql8新特性二
下一篇: mysql json介绍
wiscourper_
博客等级 码龄17年 1641粉丝 272原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值