MySQL數據類型 - JSON數據類型 (4)

JSON值的比較和排序html

JSON值可使用=,<,<=,>,>=,<>,!=,和<=>運算符進行比較。mysql

JSON值尚不支持如下比較運算符和函數:sql

●BETWEENjson

●IN()數組

●GREATEST()ide

●LEAST()函數

要想使用上面這些列出的比較運算符和函數,一個解決方法是將JSON值轉換爲原生MySQL數值或字符串數據類型,以便它們具備一致的非JSON標量類型。優化

JSON值的比較在兩個級別進行。第一級比較基於所比較值的JSON類型。若是類型不一樣,則比較結果僅由哪一個類型具備更高的優先級來肯定。若是這兩個值具備相同的JSON類型,則使用特定於類型的規則進行第二級比較。編碼

下面的列表顯示了JSON類型的優先級,從最高優先級到最低優先級。(類型名是由JSON_TYPE()函數返回的類型)同一行中顯示的類型具備相同的優先級。列表中前面列出的JSON類型的值都比列表中後面列出的JSON類型的值大。3d

MySQL數據類型 - JSON數據類型 (4)

對於具備相同優先級的JSON值,比較規則是依據於特定類型的:

●BLOB

比較兩個值的前N個字節,其中N是較短值的字節數。若是兩個值的前N個字節相同,則短值排在長值以前。

●BIT

與BLOB規則相同。

●OPAQUE

與BLOB規則相同。OPAQUE值是指不屬於其餘類型的值。

●DATETIME

表示較早時間點的值排在表示稍後時間點的值以前。若是兩個值最初分別來自MySQL DATETIME和TIMESTAMP類型,那麼若是它們表示相同的時間點,那麼它們是相等的。

●TIME

兩個時間值中較小的一個排在較大的時間值以前。

●DATE

較早的日期排在較近的日期以前。

●ARRAY

若是兩個JSON數組的長度相同,而且數組中相應位置的值相等,則它們是相等的。

若是數組不相等,則它們的順序由第一個位置有差別的元素決定。該位置值較小的數組排在前面。若是較短數組的全部值都等於較長數組中的相應值,則較短數組排在前面。

例子:

MySQL數據類型 - JSON數據類型 (4)
●BOOLEAN

JSON false字面量小於JSON true字面量。

●OBJECT

若是兩個JSON對象具備相同的鍵集,而且每一個鍵在兩個對象中都具備相同的值,那麼它們是相等的。

例子:
MySQL數據類型 - JSON數據類型 (4)

●STRING

兩個字符串比較前N個字節,這些字節以utf8mb4編碼表示,並按照字典順序排列,其中N是較短字符串的長度。若是兩個字符串的前N個字節相同,則認爲較短的字符串比較長的字符串小。

例子:

MySQL數據類型 - JSON數據類型 (4)

此排序至關於使用排序規則utf8mb4_bin對SQL字符串進行排序。因爲utf8mb4_bin是二進制排序規則,所以JSON值的比較區分大小寫:

MySQL數據類型 - JSON數據類型 (4)

●INTEGER, DOUBLE

JSON值能夠包含精確的數值和近似的數值。

在JSON值中比較數字的規則與原生MySQL數值類型的比較規則有些不一樣:

■ 在分別使用原生MySQL INT和DOUBLE 數字類型的兩個列之間的比較中,全部比較都涉及一個整數和一個雙精度類型,所以全部行,整數都轉換爲雙精度類型。也就是說,精確的數值被轉換成近似的數值。

■ 另外一方面,若是查詢比較兩個包含數字的JSON列,則沒法預先知道數字是整數仍是雙精度。爲了在全部行中提供最一致的行爲,MySQL將近似值數字轉換爲精確值數字。結果排序是一致的,而且精確值不會丟失精度。例如,給定標量922337203685477580五、922337203685477580六、9223372036854775807和9.223372036854776e18,順序以下:

MySQL數據類型 - JSON數據類型 (4)

若是JSON比較使用非JSON數值比較規則,則可能會出現順序不一致的狀況。一般的MySQL數字比較規則會產生如下順序:

■ 整數比較:
MySQL數據類型 - JSON數據類型 (4)

■ 雙精度比較:

MySQL數據類型 - JSON數據類型 (4)

對於任何JSON值與SQL NULL的比較,結果是未知的。

爲了比較JSON和非JSON值,非JSON值根據下表的規則轉換爲JSON,而後按照前面的描述進行比較。

在JSON和非JSON值之間的轉換

下表彙總了MySQL在JSON值和其餘類型值之間轉換時遵循的規則:

MySQL數據類型 - JSON數據類型 (4)

JSON值的ORDER BY和GROUP BY處理基於如下原則:

●標量JSON值的排序使用與前面討論中相同的規則。

●對於升序排序,SQL NULL順序在全部JSON值(包括JSON null字面量)以前;對於降序排序,SQL NULL順序位於全部JSON值(包括JSON null字面量)以後。

●JSON值的排序鍵由max_sort_length系統變量的值綁定,所以第一個max_sort_length字節相同,以後纔不一樣的鍵被認定爲相等。

●當前不支持對非標量值進行排序,會出現警告。

對於排序,將JSON標量轉換爲其餘一些原生MySQL類型是有益的。例如,若是名爲jdoc的列包含JSON對象,該對象有一個成員由id鍵和非負值組成,則使用此表達式按id值排序:

MySQL數據類型 - JSON數據類型 (4)

若是有一個生成的列被定義爲使用與ORDER BY中相同的表達式,MySQL優化器會識別出這一點,並考慮將索引用於查詢執行計劃。

JSON值聚合

對於JSON值的聚合,SQL NULL值被忽略,就像在其餘數據類型中同樣。非NULL值將轉換爲數值類型並進行聚合,但MIN()、MAX()和GROUP_CONCAT()除外。若是JSON的值是數值標量,轉換成數字是有意義,儘管(取決於值)可能會發生截斷和精度損失。其餘JSON值轉換成數量可能不會產生有意義的結果。

官方文檔地址:
https://dev.mysql.com/doc/refman/8.0/en/json.html

相關文章
相關標籤/搜索