MySQL 5.7中有json存储类型了以前我们只能通过php来进行序列化了不过现在就不需要了我们可以直接使用MySQL 5.7的json数据类型来存储json格式数据了,具体来看介绍。
在MySQL 5.7.8中,MySQL支持原生JSON 数据类型,使有效的数据访问在JSON(JavaScript对象符号)的文件。该 JSON数据类型提供了这些优点存储JSON格式的字符串,字符串中的列:
自动验证存储在JSON文件 JSON列。无效的文件产生错误。
优化的存储格式。存储在JSON文件 JSON列转换为内部格式,允许以文档元素快速读取权限。当服务器后来必须读取存储在此的二进制格式的JSON值,该值不必从一个文本表示解析。二进制格式的结构,以使服务器查找子对象或嵌套值直接通过按键或数组索引没有之前或之后他们在文件中读取所有的值。
注意
本讨论使用“JSON”的单型来具体说明JSON数据类型和 “JSON”常规字体,表示一般的JSON数据。
存储在JSON文档的大小的JSON 列被限制为值 max_allowed_packet的系统变量。(当服务器在存储器内部操纵一个JSON值,也可以是较大的;所述规定范围内时,服务器存储它)。
JSON列不能有默认值。
JSON列不能被索引。您可以通过创建一个生成列提取从一个标值的指数变通解决此限制JSON 列。见 辅助索引和虚拟生成的列,对于一个具体的例子。
下面的讨论包括以下主题:
随着JSON数据类型,一组SQL函数可用来对JSON的值,如创建,操作和搜索启用的操作。后续的讨论示出了这些操作的示例。各功能的详细信息,请参阅第12.16章节,“JSON功能”。
一组空间功能上GeoJSON值的操作也可以。参见第11年12月15日,“空间GeoJSON功能”。
创建JSON值
一个JSON数组包含在由逗号分隔并括值的列表[and] 字符:
["abc", 10, null, true, false]
一个JSON对象包含了一组内由逗号分隔并括键/值对{and}字符:
{"k1": "value", "k2": 10}
作为例子说明,JSON数组和对象可以包含标量值是字符串或数字,JSON null文本,或者JSON布尔真或假的文字。在JSON对象键必须是字符串。时间(日期,时间或日期)标值也是允许的:
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
嵌套是允许的JSON数组元素和JSON对象键值中:
[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
您也可以从一些由MySQL为这个目的而提供的功能得到JSON值(见 第12.16.2,“创造JSON值的函数”)以及由铸造其他类型的值的JSON使用类型 CAST(价值 AS JSON)(见 JSON和非JSON的值之间转换)。在接下来的几个段落描述的MySQL如何处理作为输入提供的JSON值。
在MySQL中,JSON值写为字符串。MySQL的解析在上下文需要一个JSON值使用的任何串,并产生一个错误,如果它不是有效的为JSON。这些环境包括插入值,即有一列 JSON数据类型,并传递一个参数传递给函数需要一个JSON值,如下面的例子演示:
试图将值插入一个JSON 列成功,如果值是一个有效的JSON值,但未能如果不是:
mysql>
CREATE TABLE t1 (jdoc JSON);
Query OK, 0 rows affected (0.20 sec)
mysql>
INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
Query OK, 1 row affected (0.01 sec)
mysql>
INSERT INTO t1 VALUES('[1, 2,');
ERROR 3140 (22032) at line 2: Invalid JSON text: "Invalid value." at position 6 in value (or column) '[1, 2,'.
对于位置“ 的位置 ñ”在这样的错误信息是从零开始的,但应该算是其中在价值问题实际发生粗糙的迹象。
该JSON_TYPE()函数需要一个JSON的说法,并试图解析成JSON值。它返回值的JSON类型,如果它是有效的否则会产生一个错误:
mysql>
SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY |
+----------------------------+
mysql>
SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING |
+----------------------+
mysql>
SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
MySQL使用了在JSON上下文中使用字符串 utf8mb4字符集和 utf8mb4_bin整理。在其他的字符集字符串转换为utf8mb4是必要的。(对于字符串ASCII或 UTF-8字符集,则不需要转换,因为ASCII和UTF8的子集utf8mb4。)
作为替代使用文字字符串写入JSON值,函数组成的组成元素的JSON值存在。JSON_ARRAY()取值的(可能为空)列表,并返回一个包含这些值的JSON数组:
mysql>
SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW()) |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
JSON_OBJECT()采用键/值对(可能为空)列表,并返回一个包含这些对一个JSON对象:
mysql>
SELECT JSON_OBJECT('key1', 1, 'key2', 'abc');
+---------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc') |
+-------------------------------------