萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> MySQL 5.7的JSON數據類型詳解介紹

MySQL 5.7的JSON數據類型詳解介紹

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') |
+---------------------------------------+
| {"key1": 1, "key2": "abc"}            |
+---------------------------------------+
JSON_MERGE()需要兩個或更多的JSON文件,並返回綜合作用的結果:

mysql>
SELECT JSON_MERGE('["a", 1]', '{"key": "value"}');

+--------------------------------------------+
| JSON_MERGE('["a", 1]', '{"key": "value"}') |
+--------------------------------------------+
| ["a", 1, {"key": "value"}]                 |
+--------------------------------------------+
有關合並規則的信息,請參閱 規范化,合並和JSON價值Autowrapping。

可以JSON值分配到用戶定義的變量:

mysql>
SET @j = JSON_OBJECT('key', 'value');

mysql>
SELECT @j;

+------------------+
| @j               |
+------------------+
| {"key": "value"} |
+------------------+
然而,用戶定義的變量不能是 JSON數據類型,所以雖然 @j在前面的例子中看起來像一個JSON值並具有作為一個JSON值相同的字符集和校對規則,它不具備 JSON數據類型。相反,結果從 JSON_OBJECT()被轉換為字符串時分配給變量。

通過將JSON值所產生的字符串有一個字符集utf8mb4和排序規則 utf8mb4_bin:

mysql>
SELECT CHARSET(@j), COLLATION(@j);

+-------------+---------------+
| CHARSET(@j) | COLLATION(@j) |
+-------------+---------------+
| utf8mb4     | utf8mb4_bin   |
+-------------+---------------+
因為utf8mb4_bin是一個二進制排序,JSON值的比較是區分大小寫。

mysql>
SELECT JSON_ARRAY('x') = JSON_ARRAY('X');

+-----------------------------------+
| JSON_ARRAY('x') = JSON_ARRAY('X') |
+-----------------------------------+
|                                 0 |
+-----------------------------------+
區分大小寫也適用於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'.
JSON的文本中區分大小寫不同於SQL的NULL,TRUE和 FALSE文字,它可以用任何大小寫:

mysql>
SELECT ISNULL(null), ISNULL(Null), ISNULL(NULL);

+--------------+--------------+--------------+
| ISNULL(null) | ISNULL(Null) | ISNULL(NULL) |
+--------------+--------------+--------------+
|            1 |            1 |            1 |
+--------------+--------------+--------------+
規范化,合並JSON價值Autowrapping,和

當一個字符串進行分析,發現是一個有效的JSON文件,也歸:會員與重復前面的文檔中找到被丟棄(即使值不同)的關鍵鑰匙。通過以下產生的對象值 JSON_OBJECT()調用不包括第二個鍵1,因為鍵名先前在值出現的元素:

mysql>
SELECT JSON_OBJECT('key1', 1, 'key2', 'abc', 'key1', 'def');

+------------------------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc', 'key1', 'def') |
+------------------------------------------------------+
| {"key1": 1, "key2": "abc"}                           |
+------------------------------------------------------+
由MySQL執行的規范化也排序的JSON對象的鍵(讓查找更高效的目的)。這個排序的結果是隨時更改,不保證在發布一致。此外,在原始文檔中鍵,值或元素之間多余的空格被丟棄。

產生的JSON值MySQL的函數(請參見 第12.16.2“功能,創造JSON值”)總是返回的標准值。

在上下文,結合多個陣列,該陣列由串聯後來被命名為第一個陣列的高端陣列合並成一個單一的陣列。在下面的例子中 ,JSON_MERGE()合並其參數為一個數組:

mysql>
SELECT JSON_MERGE('[1, 2]', '["a", "b"]', '[true, false]');

+-----------------------------------------------------+
| JSON_MERGE('[1, 2]', '["a", "b"]', '[true, false]') |
+-----------------------------------------------------+
| [1, 2, "a", "b", true, false]                       |
+-----------------------------------------------------+
當合並多個對象產生一個單一的對象。如果多個對象具有相同的密鑰,在合並後的對象鍵的值是一個包含鍵值的數組:

mysql>
SELECT JSON_MERGE('{"a": 1, "b": 2}', '{"c": 3, "a": 4}');

+----------------------------------------------------+
| JSON_MERGE('{"a": 1, "b": 2}', '{"c": 3, "a": 4}') |
+----------------------------------------------------+
| {"a": [1, 4], "b": 2, "c": 3}                      |
+----------------------------------------------------+
在上下文中,需要一個數組值用於非數組值autowrapped:該值是由包圍[ 和]的字符將其轉換成一個數組。在下面的語句,每個參數autowrapped作為數組([1],[2])。這些都是然後合並,以產生一個結果數組:

mysql>
SELECT JSON_MERGE('1', '2');

+----------------------+
| JSON_MERGE('1', '2') |
+----------------------+
| [1, 2]               |
+----------------------+
數組和對象的值合並由autowrapping的對象數組和合並兩個數組:

mysql>
SELECT JSON_MERGE('[10, 20]', '{"a": "x", "b": "y"}');

+------------------------------------------------+
| JSON_MERGE('[10, 20]', '{"a": "x", "b": "y"}') |
+------------------------------------------------+
| [10, 20, {"a": "x", "b": "y"}]                 |
+------------------------------------------------+
搜索和修改的JSON值

一個JSON路徑表達式選擇一個JSON文檔內的值。

路徑表達式是與提取部分或修改一個JSON文件,到指定范圍內的文件進行操作的功能非常有用。例如,下面的查詢從一個JSON文件中提取與該成員的值 名稱鍵:

mysql>
SELECT JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name');

+---------------------------------------------------------+
| JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name') |
+---------------------------------------------------------+
| "Aztalan"                                               |
+---------------------------------------------------------+
路徑語法采用了領先的$字符代表正在審議的JSON文檔,後面可以選擇,表明該文件的相繼更具體的部分:

一個時期後跟一個鍵名名稱中的對象與給定鍵的成員。密鑰名必須用雙引號來指定,如果不加引號的名字是不是路徑表達式中是合法的(例如,如果它包含空格)。
[Ñ]附加到其選擇的陣列名稱在位置的值的路徑 Ñ陣列內。陣列位置是整數,從零開始。
路徑可以包含*或 **通配符:
[*]計算為一個JSON對象中的所有成員的值。
[*]的計算結果為在JSON數組所有元素的值。
前綴 ** 後綴 的計算結果為開頭命名的前綴和結尾的後綴名為所有路徑。
未在文件中存在的路徑(計算結果為不存在的數據)的計算結果為NULL。
讓$參照本JSON數組包含三個元素:

[3, {"a": [5, 6], "b": 10}, [99, 100]]
然後:

$ [0]的計算結果為3。
$ [1]的計算結果為{“一”:[5,6],“b”的:10}。
$ [2]的計算結果為[99,100]。
$ [3]的計算結果為空 (它指的是第四數組元素,其中不存在)。
因為$ [1]和$ [2] 計算為非標量的值,它們可以作為依據該選擇嵌套值的更多特定的路徑表達式。例如:

$ [1]。一種計算結果為[5,6]。
$ [1]。一種[1]的計算結果為 6。
$ [1] .B計算結果為 10。
$ [2] [0]的計算結果為 99。
正如前面提到的,命名鍵路徑組件必須,如果未加引號的鍵名是不合法的路徑表達式被引用。讓$參考這個值:

{"a fish": "shark", "a bird": "sparrow"}
既包含空格,必須用引號引起來的鑰匙:

$。“一條魚”的計算結果為 鲨魚。
$,“鳥”的計算結果為 麻雀。
使用通配符的路徑,來評估可以包含多個值的數組:

mysql>
SELECT JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}', '$.*');

+---------------------------------------------------------+
| JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}', '$.*') |
+---------------------------------------------------------+
| [1, 2, [3, 4, 5]]                                       |
+---------------------------------------------------------+
mysql>
SELECT JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}', '$.c[*]');

+------------------------------------------------------------+
| JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}', '$.c[*]') |
+------------------------------------------------------------+
| [3, 4, 5]                                                  |
+------------------------------------------------------------+
在下面的例子中,路徑。$ ** b 的計算結果為多個路徑($ .ab和 $ .CB)並且產生匹配的路徑值的數組:

mysql>
SELECT JSON_EXTRACT('{"a": {"b": 1}, "c": {"b": 2}}', '$**.b');

+---------------------------------------------------------+
| JSON_EXTRACT('{"a": {"b": 1}, "c": {"b": 2}}', '$**.b') |
+---------------------------------------------------------+
| [1, 2]                                                  |
+---------------------------------------------------------+
在MySQL 5.7.9或更高版本,可以使用 列 - > 路徑 用JSON列標識符和JSON路徑表達式作為一個同義詞 JSON_EXTRACT(列, 路徑 )。見 第12.16.3,“功能該搜索的JSON值”,以獲取更多信息。另見 輔助索引和虛擬生成的列。

有些功能利用現有的JSON文件,修改它以某種方式,並返回得到修改的文檔。路徑表達式顯示在文檔中進行更改。例如 ,JSON_SET(),JSON_INSERT(),和 JSON_REPLACE()各功能采取JSON文檔,以及一個或多個路徑/值對,描述其中修改文檔和要使用的值。功能不同,他們是如何在文檔中處理現有的和不存在的價值。

審議本文件:

mysql> SET @j = '["a", {"b": [true, false]}, [10, 20]]';
JSON_SET()替換值存在路徑和為不存在的路徑增加值:.

mysql>
SELECT JSON_SET(@j, '$[1].b[0]', 1, '$[2][2]', 2);

+--------------------------------------------+
| JSON_SET(@j, '$[1].b[0]', 1, '$[2][2]', 2) |
+--------------------------------------------+
| ["a", {"b": [1, false]}, [10, 20, 2]]      |
+--------------------------------------------+
在這種情況下,路徑$ [1] .B [0]選擇現有值(真),其被替換為路徑參數(以下的值1)。路徑$ [2] [2]不存在,所以相應的值(2)加入到所選擇的值 $ [2]。

JSON_INSERT()增加了新的值,但不會取代現有的值:

mysql>
SELECT JSON_INSERT(@j, '$[1].b[0]', 1, '$[2][2]', 2);

+-----------------------------------------------+
| JSON_INSERT(@j, '$[1].b[0]', 1, '$[2][2]', 2) |
+-----------------------------------------------+
| ["a", {"b": [true, false]}, [10, 20, 2]]      |
+-----------------------------------------------+
JSON_REPLACE()替換現有的值,並忽略新值:

mysql>
SELECT JSON_REPLACE(@j, '$[1].b[0]', 1, '$[2][2]', 2);

+------------------------------------------------+
| JSON_REPLACE(@j, '$[1].b[0]', 1, '$[2][2]', 2) |
+------------------------------------------------+
| ["a", {"b": [1, false]}, [10, 20]]             |
+------------------------------------------------+
路徑/值對被評估從左到右。通過評估一對產生的文件成為針對其下一對被評估的新值。

JSON_REMOVE()需要一個JSON文檔和一個或多個路徑指定的值被從文檔移除。返回值是原始文件減去文件中存在的路徑選擇的值:

mysql>
SELECT JSON_REMOVE(@j, '$[2]', '$[1].b[1]', '$[1].b[1]');

+---------------------------------------------------+
| JSON_REMOVE(@j, '$[2]', '$[1].b[1]', '$[1].b[1]') |
+---------------------------------------------------+
| ["a", {"b": [true]}]                              |
+---------------------------------------------------+
該路徑有以下影響:

$ [2]匹配 [10,20],並刪除它。
的第一個實例$ [1] .B [1]匹配 虛假的b元素並將其刪除。
第二個實例$ [1] .B [1]匹配什麼:該元素已被移除,道路不再存在,並且沒有任何效果。
比較和排序JSON價值

JSON值可使用進行比較 =,<,<=,>,> =,<>,!=和 <=> 運營商。

下面的比較操作和功能尚不支持JSON值:

之間
在()
GREATEST()
最小()
一種解決方法對於剛剛上市的比較操作符和函數是投JSON值到本機MySQL的數字或字符串數​​據類型,使他們有一個一致的非JSON標量型。

JSON值的比較發生在兩個層面。比較的第一級是根據被比較的值的JSON類型。如果類型不同,則比較結果單獨確定由類型具有更高的優先級。如果這兩個值具有相同的JSON類型,發生使用型特異性的規則比較的第二級。

下面的列表顯示JSON類型的優先級,從最高優先級到最低。(類型名是那些由返回JSON_TYPE() 函數。)一行共同顯示類型具有相同的優先級。有前面的列表中列出的JSON類型的任何值進行比較,超過其在後面的列表中列出的JSON類型的任意值。

BLOB
BIT
OPAQUE
DATETIME
TIME
DATE
BOOLEAN
ARRAY
OBJECT
STRING
INTEGER, DOUBLE
NULL
對於優先級相同的JSON值,比較規則是特定類型:

BLOB第一Ñ兩個值的字節相比較,其中Ñ是較短值中的字節數。如果第一 Ñ兩個值中的字節是相同的,較短的值的時間越長值之前排序。
BIT相同的規則BLOB。
不透明相同的規則的BLOB。 乳濁值是不屬於其它類型之一的值。
日期時間它表示一個較早的時間點A值是表示在以後某個時間點的值之前排序。如果兩個值最初來自MySQL的 DATETIME和TIMESTAMP 類型,分別為,他們是平等的,如果他們代表相同的時間點。
時間兩個時間值越小之前較大的一個排序。
日期早期的日期更近的日期之前訂購。
ARRAY兩個JSON陣列相等,如果它們有在對應於所述陣列的位置相同的長度和值相等。
如果陣列是不相等的,它們的順序是由在其中是有區別的第一位置中的元素確定的。與在該位置中的較小值的陣列一階。如果短陣列的所有值都等於較長陣列中的相應值,較短的陣列一階。

例:

[] < ["a"] < ["ab"] < ["ab", "cd", "ef"] < ["ab", "ef"]
布爾JSON的錯誤文字小於JSON真正的文字。
目的兩個JSON對象相等,如果它們具有相同的密鑰集合,並且每個鍵有兩個對象相同的值。
例:

{"a": 1, "b": 2} = {"b": 2, "a": 1}
兩個對象中不等於順序不確定但確定性。

串串是詞法在第一有序 Ñ的字節 utf8mb4兩個字符串的表示被比較,其中Ñ是較短的字符串的長度。如果第一 Ñ兩個字符串的字節是相同的,在較短的字符串被認為比較長的字符串小。
例:

"a" < "ab" < "b" < "bc"
此排序相當於SQL字符串中使用歸類排序utf8mb4_bin。因為 utf8mb4_bin是一個二進制排序,JSON值的比較是區分大小寫:

"A" < "a"
INTEGER,DOUBLEJSON值可以包含准確值數值和近似值數值。對於這些類型的數字的一般討論,請參見第9.1.2節,“數字字面”。
比較原生的MySQL數值類型的規則在討論第12.2節,“在表達式求值類型轉換”,但對於JSON值范圍內比較數的規則有所不同:

在使用天然的MySQL兩列之間的比較的INT和 雙數字類型,分別已知的是所有的比較涉及一個整數和一個雙重的,所以整數轉換為加倍所有行。也就是說,准確值數值轉換為近似值數值。
另一方面,如果查詢比較包含數字2的JSON列,它不能被事先已知的數字是否是整數或雙。為客戶提供橫跨所有行的最一致的行為,MySQL的近似值數值轉換為准確值數值。由此產生的順序是一致的,不會丟失精度的准確值數值。例如,給定的標量9223372036854775805,9223372036854775806,9223372036854775807和9.223372036854776e18,順序是如此:
9223372036854775805 < 9223372036854775806 < 9223372036854775807
< 9.223372036854776e18 = 9223372036854776000 < 9223372036854776001
是JSON的比較使用非JSON數值比較規則,可能會出現不一致的排序。對數字通常MySQL的比較規則產生這些排序:

整數比較:
9223372036854775805 < 9223372036854775806 < 9223372036854775807
(沒有定義9.223372036854776e18)

雙重對比:
9223372036854775805 = 9223372036854775806 = 9223372036854775807 = 9.223372036854776e18
對於任何一個JSON值的SQL比較空,結果是未知的。

對於JSON和非JSON值的比較,所述非JSON值根據如先前所描述的相比,下表中的規則,那麼這些值轉換為JSON。

JSON和非JSON的值之間的轉換。 下表提供的JSON值和其他類型的值之間的鑄造時的MySQL遵循規則的摘要:


表11.1 JSON轉換規則

其他類型 CAST(其它類型為JSON) CAST(JSON作為其他類型的)
JSON 不用找了 不用找了
utf8字符類型 (utf8mb4,UTF8,ASCII) 該字符串被解析成一個JSON值。 JSON的值序列化為utf8mb4字符串。
其他字符類型 其它字符編碼的隱式轉換為 utf8mb4和所描述的UTF-8字符類型處理。 JSON的值序列化為utf8mb4字符串,然後轉換為其他字符編碼。其結果可能沒有意義。
空值 結果在一個NULL類型的JSON值。 不適用。
幾何類型 幾何值是通過調用轉換成JSON文件 ST_AsGeoJSON()。 非法操作。解決方法:通過的結果 CAST(json_val AS CHAR)到 ST_GeomFromGeoJSON()。
所有其他類型 結果在一個JSON文件由單個標量值。 成功,如果JSON文件包括目標類型的單個標值和標量值可以轉換為目標類型。否則,返回NULL 並產生警告。

ORDER BY和GROUP BY為JSON值是根據這些原則的工作原理:

訂購標JSON值使用相同的規則在前面的討論。
對於升序排序,SQL NULL命令所有的JSON值,包括JSON null文本之前; 為降序排序,SQL NULL命令所有的JSON值後,包括JSON null文本。
排序鍵JSON值由值約束 的max_sort_length系統變量,因此,只有後的第一個不同的密鑰 max_sort_length個字節的比較結果相等。
非標量數值排序目前不支持,並發出警告。
對於排序,也可以是有益的投JSON標到一些其他本地MySQL的類型。例如,如果一個名為列 jdoc包含具有由一個成員JSON對象ID鍵和一個非負值,用這個表達排序ID 值:

ORDER BY CAST(JSON_EXTRACT(jdoc, '$.id') AS UNSIGNED)
如果恰好是定義為使用相同的表達式作為生成列ORDER BY,MySQL 優化認識到並考慮使用索引的查詢執行計劃。見 第8.3.9,“優化器使用的生成列的索引”。

JSON值的聚合

對於JSON值的聚合,SQL NULL 值被忽略為其它數據類型。非NULL值轉換為數值型和匯總,除了 MIN(),MAX(),和 GROUP_CONCAT()。轉換為數字應該產生一個有意義的結果對JSON值是數字標量,雖然(取決於值)截斷和精度可能會發生損失。轉化為其它的JSON值數目可能無法產生一個有意義的結果。

copyright © 萬盛學電腦網 all rights reserved