MySQL 5.7.8 版本开始支持JSON类型,在JSON类型支持之前,通常使用字符串类型存储JSON数据,相对于字符串,原生的JSON类型能够对数据的有效性进行验证。JSON类型独特的内部存储格式和索引,能够更加高效的访问JSON数据节点。另外MySQL提供丰富的JSON类型相关函数,JSON数据的查询与操作更加便捷。
1、JSON类型优势:
- 自动验证JSON数据的有效性,不符合JSON规范的数据将会提示报错。
- 优化存储格式,JSON类型在存储时被转换成一种内部的格式,能够快速地访问JSON文档数据的元素。
- 丰富的JSON类型相关函数,JSON数据操作更加便捷。
2、常用的JSON类型:
- JSON数组,如:[1,2]
- JSON对象,如:{"key":"value"}
示例:
创建一个包含JSON类型的表:
create table tb(c json);
插入JSON数据:
insert into tb values('[1,2]');
insert into tb values('{"key":"value"}');
查询表中JSON数据的值:
select c->"$.key" from tb;
查出来的结果是带引号的,想去除引号的话,把->换成->>,如下:
select c->>"$.key" from tb;
3、JSON函数:
- JSON_TYPE()
- JSON_VALID()
- JSON_ARRAY()
- JSON_OBJECT()
- JSON_MERGE()
- JSON_EXTRACT()
- JSON_SET()
- JSON_INSERT()
- JSON_REPLACE()
- JSON_REMOVE()
- JSON_SEARCH()
- JSON_CONTAINS_PATH()
3.1 JSON_TYPE()
JSON_TYPE() 函数返回 JSON数据的类型,JSON数组返回ARRAY,JSON对象返回OBJECT,如下所示:
mysql> select JSON_TYPE('[1,2]');
+--------------------+
| JSON_TYPE('[1,2]') |
+--------------------+
| ARRAY |
+--------------------+
mysql> select JSON_TYPE('{"key":"value"}');
+------------------------------+
| JSON_TYPE('{"key":"value"}') |
+------------------------------+
| OBJECT |
+------------------------------+
3.2 JSON_VALID()
JSON_VALID() 函数用于判断数据是否为有效的JSON数据,有效返回1,无效返回0。如下所示:
mysql> select JSON_VALID('["abc"]');
+-----------------------+
| JSON_VALID('["abc"]') |
+-----------------------+
| 1 |
+-----------------------+
mysql> select JSON_VALID('{abc}');
+---------------------+
| JSON_VALID('{abc}') |
+---------------------+
| 0 |
+---------------------+
3.3 JSON_ARRAY()
JSON_ARRAY()函数用于构造一个JSON数组,如下:
mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW()) |
+----------------------------------------+
| ["a", 1, "2020-02-18 19:09:41.000000"] |
+----------------------------------------+
3.4 JSON_OBJECT()
JSON_OBJECT()函数用于构造一个JSON对象,如下:
mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc');
+---------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc') |
+---------------------------------------+
| {"key1": 1, "key2": "abc"} |
+---------------------------------------+
3.5 JSON_MERGE()
JSON_MERGE()函数用于合并两个JSON数据,如下:
mysql> SELECT JSON_MERGE('["a", 1]', '{"key": "value"}');
+--------------------------------------------+
| JSON_MERGE('["a", 1]', '{"key": "value"}') |
+--------------------------------------------+
| ["a", 1, {"key": "value"}] |
+--------------------------------------------+
3.6 JSON_EXTRACT()
JSON_EXTRACT()函数用于精准查询JSON数据中的某个元素,比如获取某个key对应的value,如下:
mysql> SELECT JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name');
+---------------------------------------------------------+
| JSON_EXTRACT('{"id": 14,"name":"Aztalan"}', '$.name') |
+---------------------------------------------------------+
| "Aztalan" |
+---------------------------------------------------------+
3.7 JSON_SET()
JSON_SET()函数用于设置JSON中的某个值,如下:
mysql> SELECT JSON_SET('["x","y"]', '$[0]', 'a');
+------------------------------------+
| JSON_SET('["x","y"]', '$[0]', 'a') |
+------------------------------------+
| ["a", "y"] |
+------------------------------------+
3.8 JSON_INSERT()
JSON_INSERT()函数用于在JSON数据中插入新的值,如下:
mysql> SELECT JSON_INSERT('["x","y"]', '$[2]', 'a');
+---------------------------------------+
| JSON_INSERT('["x","y"]', '$[2]', 'a') |
+---------------------------------------+
| ["x", "y", "a"] |
+---------------------------------------+
3.9 JSON_REPLACE()
JSON_REPLACE()函数用于替换JSON数据中的某个值,示例如下:
mysql> SELECT JSON_REPLACE('["x","y"]', '$[0]', 'a');
+----------------------------------------+
| JSON_REPLACE('["x","y"]', '$[0]', 'a') |
+----------------------------------------+
| ["a", "y"] |
+----------------------------------------+
3.10 JSON_REMOVE()
JSON_REMOVE()函数用于移除JSON数据中的某个值,示例如下:
mysql> SELECT JSON_REMOVE('["x","y"]', '$[0]');
+----------------------------------+
| JSON_REMOVE('["x","y"]', '$[0]') |
+----------------------------------+
| ["y"] |
+----------------------------------+
3.11 JSON_SEARCH()
JSON_SEARCH()函数用于搜索JSON数据中的某个值,参数one表示只搜索符合条件的一个结果,all表示搜索所有结果,示例如下:
mysql> SET @j = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT JSON_SEARCH(@j, 'one', 'abc');
+-------------------------------+
| JSON_SEARCH(@j, 'one', 'abc') |
+-------------------------------+
| "$[0]" |
+-------------------------------+
1 row in set (0.00 sec)
mysql> SELECT JSON_SEARCH(@j, 'all', 'abc');
+-------------------------------+
| JSON_SEARCH(@j, 'all', 'abc') |
+-------------------------------+
| ["$[0]", "$[2].x"] |
+-------------------------------+
1 row in set (0.00 sec)
3.12 JSON_CONTAINS_PATH()
JSON_CONTAINS_PATH()函数用于搜索符合条件的JSON路径,如果搜索到符合条件的路径,返回1,否则返回0。示例如下:
mysql> SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a', '$.e') as t;
+------+
| t |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> SELECT JSON_CONTAINS_PATH(@j, 'all', '$.a', '$.e') as t;
+------+
| t |
+------+
| 0 |
+------+
1 row in set (0.00 sec)
mysql> SELECT JSON_CONTAINS_PATH(@j, 'one', '$.c.d') as t;
+------+
| t |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a.d') as t;
+------+
| t |
+------+
| 0 |
+------+
1 row in set (0.00 sec)
4、最后
MySQL 支持JSON类型的时间并不算太久,功能还很简单,甚至还有许多未知的Bug,更多MySQL JSON相关资料请参考官方文档:
https://dev.mysql.com/doc/refman/5.7/en/json.html