MySQL中的JSON数据类型 7 JSON 值的比较和排序

JSON 值可以使用=、 < 、 <=、 >、 >=、 <> 、!=<=>运算符进行比较。

JSON 值尚不支持以下比较运算符和函数:

刚刚列出的比较运算符和函数的解决方法是将 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

    比较两个值的前N个字节,其中N是较短值中的字节数。如果两个值的前N个字节相同,则较短的值先于较长的值排序。

  • BIT

    与 相同的规则。BLOB

  • OPAQUE

    与 相同的规则。 值是未分类为其他类型之一的值。BLOBOPAQUE

  • DATETIME

    表示较早时间点的值在表示较晚时间点的值之前排序。如果两个值最初分别来自MySQL和类型,则当它们表示相同的时间点时,它们是相等的。DATETIMETIMESTAMP

  • TIME

    两个时间值中较小的一个在较大的时间值之前排序。

  • DATE

    较早的日期在较新的日期之前排序。

  • ARRAY

    如果两个 JSON 数组具有相同的长度,并且数组中相应位置的值相等,则它们是相等的。

    如果数组不相等,则它们的顺序由存在差异的第一个位置的元素确定。该位置中值较小的数组首先排序。如果较短数组的所有值都等于较长数组中的相应值,则首先对较短的数组进行排序。

    例:

    [] < ["a"] < ["ab"] < ["ab", "cd", "ef"] < ["ab", "ef"]
  • BOOLEAN

    JSON 假文本小于 JSON true 文本。

  • OBJECT

    如果两个 JSON 对象具有相同的键集,则它们是相等的,并且每个键在两个对象中具有相同的值。

    例:

    {"a": 1, "b": 2} = {"b": 2, "a": 1}

    两个不相等的对象的顺序是未指定的,但具有确定性。

  • STRING

    字符串按词法对要比较的两个字符串表示形式的前N个字节进行排序,其中N是较短字符串的长度。如果两个字符串的前N个字节相同,则较短的字符串被视为小于较长的字符串。utf8mb4

    例:

    "a" < "ab" < "b" < "bc"

    此排序等效于对具有排序规则的 SQL 字符串进行排序。由于是二进制排序规则,因此 JSON 值的比较区分大小写:utf8mb4_binutf8mb4_bin

    "A" < "a"
  • INTEGER,DOUBLE

    JSON 值可以包含精确值数字和近似值数字。有关这些类型数字的一般讨论,请参见第 9.1.2 节 "数字文本"。

    12.3 节 "表达式计算中的类型转换"中讨论了比较本机 MySQL 数值类型的规则,但比较 JSON 值内数字的规则有所不同:

    • 在分别使用本机 MySQL INTDOUBLE数值类型的两列之间的比较中,已知所有比较都涉及整数和双精度,因此所有行的整数都转换为双精度。也就是说,精确值数字将转换为近似值数字。

    • 另一方面,如果查询比较两个包含数字的 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 进行比较,结果是 。NULLUNKNOWN

为了比较 JSON 和非 JSON 值,将根据下表中的规则将非 JSON 值转换为 JSON,然后按前面所述比较的值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值