MySQL 5.7新支持--------Json类型实战

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,如需转载请自行联系原作者




上一篇:解决React脚手架保存后浏览器不能及时刷新的问题


下一篇:WPF的“.NET研究”消息机制(一)- 让应用程序动起来