MySQL支持RFC 7159
MySQL 8.0還使用該 功能支持RFC 7396中定義的JSON Merge Patch格式 ,。有關示例和更多信息,請參見此函數(shù)的描述以及 JSON值的規(guī)范化,,合并和自動包裝,。
存儲 在MySQL 8.0.13之前, 除 還提供了一組用于處理GeoJSON值的空間函數(shù)。請參見第12.17.11節(jié)“空間GeoJSON函數(shù)”,。
MySQL優(yōu)化器還在與JSON表達式匹配的虛擬列上尋找兼容的索引。 在MySQL 8.0.17及更高版本中,, MySQL NDB Cluster 8.0支持 JSON值的部分更新在MySQL 8.0中,優(yōu)化器可以對列執(zhí)行部分就地更新,
可以使用節(jié)省空間的緊湊格式將此類部分更新寫入二進制日志??梢酝ㄟ^將 接下來的幾節(jié)提供有關JSON值的創(chuàng)建和操作的基本信息,。 創(chuàng)建JSON值
JSON數(shù)組包含一個值列表,這些值用逗號分隔并包含在 ["abc", 10, null, true, false]
JSON對象包含一組鍵值對,,以逗號分隔并包含在 {"k1": "value", "k2": 10}
如示例所示,,JSON數(shù)組和對象可以包含字符串或數(shù)字的標量值,JSON空文字或JSON布爾值true或false文字,。JSON對象中的鍵必須是字符串,。還允許使用時間(日期,時間或日期時間)標量值: ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
JSON數(shù)組元素和JSON對象鍵值中允許嵌套: [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
為此,,您還可以從MySQL提供的許多函數(shù)中獲取JSON值(請參見 第12.18.2節(jié)“創(chuàng)建JSON值的函數(shù)”),,以及通過
在MySQL中,,JSON值被寫為字符串,。MySQL會解析在需要JSON值的上下文中使用的任何字符串,如果該字符串作為JSON無效,,則會產(chǎn)生錯誤,。這些上下文包括將值插入具有
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:
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
MySQL使用 作為使用文字字符串編寫JSON值的替代方法,,存在用于從組件元素組成JSON值的函數(shù)。 mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW()) |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc');
+---------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc') |
+---------------------------------------+
| {"key1": 1, "key2": "abc"} |
+---------------------------------------+
mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
+-----------------------------------------------------+
| JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
+-----------------------------------------------------+
| ["a", 1, {"key": "value"}] |
+-----------------------------------------------------+
1 row in set (0.00 sec)
有關合并規(guī)則的信息,請參見 JSON值的規(guī)范化,,合并和自動包裝,。 (MySQL 8.0.3和更高版本也支持 可以將JSON值分配給用戶定義的變量: mysql> SET @j = JSON_OBJECT('key', 'value');
mysql> SELECT @j;
+------------------+
| @j |
+------------------+
| {"key": "value"} |
+------------------+
但是,,用戶定義的變量不能是 通過轉(zhuǎn)換JSON值產(chǎn)生的字符串的字符集為 mysql> SELECT CHARSET(@j), COLLATION(@j);
+-------------+---------------+
| CHARSET(@j) | COLLATION(@j) |
+-------------+---------------+
| utf8mb4 | utf8mb4_bin |
+-------------+---------------+
因為 mysql> SELECT JSON_ARRAY('x') = JSON_ARRAY('X');
+-----------------------------------+
| JSON_ARRAY('x') = JSON_ARRAY('X') |
+-----------------------------------+
| 0 |
+-----------------------------------+
區(qū)分大小寫也適用于JSON 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'.
從該SQL的JSON文字不同的情況下的靈敏度 mysql> SELECT ISNULL(null), ISNULL(Null), ISNULL(NULL);
+--------------+--------------+--------------+
| ISNULL(null) | ISNULL(Null) | ISNULL(NULL) |
+--------------+--------------+--------------+
| 1 | 1 | 1 |
+--------------+--------------+--------------+
有時可能需要或希望在JSON文檔中插入引號字符( mysql> CREATE TABLE facts (sentence JSON);
這些關鍵字句子對中的一個是: mascot: The MySQL mascot is a dolphin named "Sakila".
將其作為JSON對象插入 mysql> INSERT INTO facts VALUES
> (JSON_OBJECT("mascot", "Our mascot is a dolphin named \"Sakila\"."));
如果您將值作為JSON對象文字插入,,則此方法無法以相同的方式工作,在這種情況下,,必須使用雙反斜杠轉(zhuǎn)義序列,,如下所示: mysql> INSERT INTO facts VALUES
> ('{"mascot": "Our mascot is a dolphin named \\"Sakila\\"."}');
使用雙反斜杠使MySQL無法執(zhí)行轉(zhuǎn)義序列處理,而是使它將字符串文字傳遞給存儲引擎進行處理,。以上述兩種方式插入JSON對象后,,您可以通過執(zhí)行以下簡單操作看到JSON列值中存在反斜杠 mysql> SELECT sentence FROM facts;
+---------------------------------------------------------+
| sentence |
+---------------------------------------------------------+
| {"mascot": "Our mascot is a dolphin named \"Sakila\"."} |
+---------------------------------------------------------+
要查找使用 mysql> SELECT col->"$.mascot" FROM qtest;
+---------------------------------------------+
| col->"$.mascot" |
+---------------------------------------------+
| "Our mascot is a dolphin named \"Sakila\"." |
+---------------------------------------------+
1 row in set (0.00 sec)
這使反斜杠以及周圍的引號保持完整,。要使用 mysql> SELECT sentence->>"$.mascot" FROM facts;
+-----------------------------------------+
| sentence->>"$.mascot" |
+-----------------------------------------+
| Our mascot is a dolphin named "Sakila". |
+-----------------------------------------+
注意 如果 mysql> INSERT INTO facts VALUES
> (JSON_OBJECT('mascot', 'Our mascot is a dolphin named "Sakila".'));
有關 JSON值的規(guī)范化,,合并和自動包裝 等其他更多內(nèi)容請查看原文 |
|