1. 背景
* 在MySQL 5.7.8中,MySQL支持由RFC 7159定义的本地JSON数据类型,它支持对JSON(JavaScript对象标记)文档中的数据进行有效访问.
* MySQL会对DML JSON数据自动验证。无效的DML JSON数据操作会产生错误.
* 优化的存储格式。存储在JSON列中的JSON文档转换为一种内部格式,允许对Json元素进行快速读取访问.
* MySQL Json类型支持建立索引增加查询性能提升.
2. Json类型所需的存储空间和值范围
类型 | 占用字节 | 最大长度 |
Json | 数据长度 + 4 bytes |
4G |
3. Json相关函数操作
* JSON_OBJECT(string1, string2...) 创建 key-value 类型 Json 对象
1
2
3
4
5
6
7
|
mysql> SELECT JSON_OBJECT( 'k1' , 'v1' , 'k2' , 'v2' );
+-------------------------------------+ | JSON_OBJECT( 'k1' , 'v1' , 'k2' , 'v2' ) |
+-------------------------------------+ | { "k1" : "v1" , "k2" : "v2" } |
+-------------------------------------+ 1 row in set (0.01 sec)
|
* JSON_ARRAY(string1, string2...) 创建一个 Json 数组
1
2
3
4
5
6
7
|
mysql> SELECT JSON_ARRAY( 'a' , 'b' , 'c' , 'd' );
+--------------------------------+ | JSON_ARRAY( 'a' , 'b' , 'c' , 'd' ) |
+--------------------------------+ | [ "a" , "b" , "c" , "d" ] |
+--------------------------------+ 1 row in set (0.00 sec)
|
* JSON_TYPE(object) 判断并显示数据类型 [ 值非法会报错显示 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
mysql> SELECT JSON_TYPE( '"lisea"' );
+----------------------+ | JSON_TYPE( '"lisea"' ) |
+----------------------+ | STRING | +----------------------+ 1 row in set (0.01 sec)
mysql> SELECT JSON_TYPE( '["a", "b", 1]' );
+----------------------------+ | JSON_TYPE( '["a", "b", 1]' ) |
+----------------------------+ | ARRAY | +----------------------------+ 1 row in set (0.01 sec)
mysql> SELECT JSON_TYPE( '1' );
+----------------+ | JSON_TYPE( '1' ) |
+----------------+ | INTEGER | +----------------+ 1 row in set (0.00 sec)
mysql> SELECT JSON_TYPE( '{"k1":"v1", "k2":"v2"}' );
+-------------------------------------+ | JSON_TYPE( '{"k1":"v1", "k2":"v2"}' ) |
+-------------------------------------+ | OBJECT | +-------------------------------------+ 1 row in set (0.00 sec)
|
* JSON_MERGE(doc1,doc2....) 合并多个Json对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
mysql> SELECT JSON_MERGE( '{"k1":"v1"}' , '{ "k2":"v2"}' );
+------------------------------------------+ | JSON_MERGE( '{"k1":"v1"}' , '{ "k2":"v2"}' ) |
+------------------------------------------+ | { "k1" : "v1" , "k2" : "v2" } |
+------------------------------------------+ 1 row in set (0.04 sec)
mysql> SELECT JSON_MERGE( '["k1","k2"]' , '{ "k3":"v3"}' );
+------------------------------------------+ | JSON_MERGE( '["k1","k2"]' , '{ "k3":"v3"}' ) |
+------------------------------------------+ | [ "k1" , "k2" , { "k3" : "v3" }] |
+------------------------------------------+ 1 row in set (0.00 sec)
|
* JSON_EXTRACT(object, key) 通过Json key方式获取Val值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
mysql> SELECT JSON_EXTRACT( '{"k1":"v1","k2":"v2"}' , '$.k1' );
+-----------------------------------------------+ | JSON_EXTRACT( '{"k1":"v1","k2":"v2"}' , '$.k1' ) |
+-----------------------------------------------+ | "v1" |
+-----------------------------------------------+ 1 row in set (0.01 sec)
mysql> SELECT JSON_EXTRACT( '{"k1":"v1","k2":"v2"}' , '$.*' );
+----------------------------------------------+ | JSON_EXTRACT( '{"k1":"v1","k2":"v2"}' , '$.*' ) |
+----------------------------------------------+ | [ "v1" , "v2" ] |
+----------------------------------------------+ 1 row in set (0.00 sec)
|
* JSON_SET(object, key, val, key, val....) 通过key修改val值
1
2
3
4
5
6
7
|
mysql> SELECT JSON_SET( '{"k1":"v1","k2":"v2"}' , '$.k1' , 'lisea' , '$.k2' , 'hello' );
+---------------------------------------------------------------------+ | JSON_SET( '{"k1":"v1","k2":"v2"}' , '$.k1' , 'lisea' , '$.k2' , 'hello' ) |
+---------------------------------------------------------------------+ | { "k1" : "lisea" , "k2" : "hello" } |
+---------------------------------------------------------------------+ 1 row in set (0.00 sec)
|
* JSON_INSERT(object, key, val)添加新值到对象中,如果key已存在,不替换val
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
mysql> SELECT JSON_INSERT( '{"k1":"v1","k2":"v2"}' , '$.k1' , 'hello' );
+-------------------------------------------------------+ | JSON_INSERT( '{"k1":"v1","k2":"v2"}' , '$.k1' , 'hello' ) |
+-------------------------------------------------------+ | { "k1" : "v1" , "k2" : "v2" } |
+-------------------------------------------------------+ 1 row in set (0.03 sec)
mysql> SELECT JSON_INSERT( '{"k1":"v1","k2":"v2"}' , '$.k3' , 'v3' );
+----------------------------------------------------+ | JSON_INSERT( '{"k1":"v1","k2":"v2"}' , '$.k3' , 'v3' ) |
+----------------------------------------------------+ | { "k1" : "v1" , "k2" : "v2" , "k3" : "v3" } |
+----------------------------------------------------+ 1 row in set (0.02 sec)
|
* JSON_REPLACE() 替换现有的值并忽略新的值
1
2
3
4
5
6
7
|
mysql> SELECT JSON_REPLACE( '{"k1":"v1","k2":"v2"}' , '$.k1' , 'hello' , '$.k3' , 'v3' );
+----------------------------------------------------------------------+ | JSON_REPLACE( '{"k1":"v1","k2":"v2"}' , '$.k1' , 'hello' , '$.k3' , 'v3' ) |
+----------------------------------------------------------------------+ | { "k1" : "hello" , "k2" : "v2" } |
+----------------------------------------------------------------------+ 1 row in set (0.01 sec)
|
* JSON_REMOVE() 通过key移除
1
2
3
4
5
6
7
|
mysql> SELECT JSON_REMOVE( '{"k1":"v1","k2":"v2"}' , '$.k1' );
+----------------------------------------------+ | JSON_REMOVE( '{"k1":"v1","k2":"v2"}' , '$.k1' ) |
+----------------------------------------------+ | { "k2" : "v2" } |
+----------------------------------------------+ 1 row in set (0.00 sec)
|
* JSON_KEYS() 获取所有key
1
2
3
4
5
6
7
|
mysql> SELECT JSON_KEYS( '{"k1":"v1","k2":"v2"}' );
+------------------------------------+ | JSON_KEYS( '{"k1":"v1","k2":"v2"}' ) |
+------------------------------------+ | [ "k1" , "k2" ] |
+------------------------------------+ 1 row in set (0.03 sec)
|
* JSON_UNQUOTE() 去掉值的引号
1
2
3
4
5
6
7
|
mysql> SELECT JSON_UNQUOTE( '"hello"' );
+-------------------------+ | JSON_UNQUOTE( '"hello"' ) |
+-------------------------+ | hello | +-------------------------+ 1 row in set (0.01 sec)
|
* JSON_DEPTH() 获取Json对象的深度
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
mysql> SELECT JSON_DEPTH( '{"k1":"v1","k2":"v2"}' );
+-------------------------------------+ | JSON_DEPTH( '{"k1":"v1","k2":"v2"}' ) |
+-------------------------------------+ | 2 | +-------------------------------------+ 1 row in set (0.00 sec)
mysql> SELECT JSON_DEPTH( '{}' );
+------------------+ | JSON_DEPTH( '{}' ) |
+------------------+ | 1 | +------------------+ 1 row in set (0.01 sec)
|
* JSON_VALID() 判断是否为有效的json格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
mysql> SELECT JSON_VALID( '{"k1":"v1"}' );
+---------------------------+ | JSON_VALID( '{"k1":"v1"}' ) |
+---------------------------+ | 1 | +---------------------------+ 1 row in set (0.00 sec)
mysql> SELECT JSON_VALID( '{"k1":"v1"' );
+--------------------------+ | JSON_VALID( '{"k1":"v1"' ) |
+--------------------------+ | 0 | +--------------------------+ 1 row in set (0.00 sec)
|
* JSON_LENGTH() 获取指定路径下的长度
长度的计算规则:
标量的长度为1
json array的长度为元素的个数
json object的长度为key的个数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
mysql> SELECT JSON_LENGTH( '[1, 2, 3]' );
+--------------------------+ | JSON_LENGTH( '[1, 2, 3]' ) |
+--------------------------+ | 3 | +--------------------------+ 1 row in set (0.00 sec)
mysql> SELECT JSON_LENGTH( '{"k1":"v1", "k2":"v2"}' );
+---------------------------------------+ | JSON_LENGTH( '{"k1":"v1", "k2":"v2"}' ) |
+---------------------------------------+ | 2 | +---------------------------------------+ 1 row in set (0.00 sec)
|
* JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])
查询包含指定字符串的paths,并作为一个json array返回
one_or_all:"one"表示查询到一个即返回;"all"表示查询所有。
search_str:要查询的字符串。 可以用LIKE里的'%'或‘_’匹配。
path:在指定path下查。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
mysql> SELECT JSON_SEARCH( '{"k1":"v1", "k2":"v2", "k3":"v2"}' , 'one' , 'v2%' );
+----------------------------------------------------------------+ | JSON_SEARCH( '{"k1":"v1", "k2":"v2", "k3":"v2"}' , 'one' , 'v2%' ) |
+----------------------------------------------------------------+ | "$.k2" |
+----------------------------------------------------------------+ 1 row in set (0.00 sec)
mysql> SELECT JSON_SEARCH( '{"k1":"v1", "k2":"v2", "k3":"v2"}' , 'all' , 'v2%' );
+----------------------------------------------------------------+ | JSON_SEARCH( '{"k1":"v1", "k2":"v2", "k3":"v2"}' , 'all' , 'v2%' ) |
+----------------------------------------------------------------+ | [ "$.k2" , "$.k3" ] |
+----------------------------------------------------------------+ 1 row in set (0.01 sec)
|
4. 总结
以需求驱动技术,技术本身没有优略之分,只有业务之分。
本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1943339,如需转载请自行联系原作者