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

相关文章
相关标签/搜索