我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL数据类型 - JSON数据类型 (4)

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码


	MySQL数据类型 - JSON数据类型 (4)


	MySQL数据类型 - JSON数据类型 (4)
[数据库教程]

JSON值的比较和排序

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

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

●BETWEEN

●IN()

●GREATEST()

●LEAST()

要想使用上面这些列出的比较运算符和函数,一个解决方法是将JSON值转换为原生MySQL数值或字符串数据类型,以便它们具有一致的非JSON标量类型。

JSON值的比较在两个级别进行。第一级比较基于所比较值的JSON类型。如果类型不同,则比较结果仅由哪个类型具有更高的优先级来确定。如果这两个值具有相同的JSON类型,则使用特定于类型的规则进行第二级比较。

下面的列表显示了JSON类型的优先级,从最高优先级到最低优先级。(类型名是由JSON_TYPE()函数返回的类型)同一行中显示的类型具有相同的优先级。列表中前面列出的JSON类型的值都比列表中后面列出的JSON类型的值大。

技术图片

对于具有相同优先级的JSON值,比较规则是依据于特定类型的:

●BLOB

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

●BIT

与BLOB规则相同。

●OPAQUE

与BLOB规则相同。OPAQUE值是指不属于其他类型的值。

●DATETIME

表示较早时间点的值排在表示稍后时间点的值之前。如果两个值最初分别来自MySQL DATETIME和TIMESTAMP类型,那么如果它们表示相同的时间点,那么它们是相等的。

●TIME

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

●DATE

较早的日期排在较近的日期之前。

●ARRAY

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

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

例子:

技术图片
●BOOLEAN

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

●OBJECT

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

例子:
技术图片

●STRING

两个字符串比较前N个字节,这些字节以utf8mb4编码表示,并按照字典顺序排列,其中N是较短字符串的长度。如果两个字符串的前N个字节相同,则认为较短的字符串比较长的字符串小。

例子:

技术图片

此排序相当于使用排序规则utf8mb4_bin对SQL字符串进行排序。由于utf8mb4_bin是二进制排序规则,因此JSON值的比较区分大小写:

技术图片

●INTEGER, DOUBLE

JSON值可以包含精确的数值和近似的数值。

在JSON值中比较数字的规则与原生MySQL数值类型的比较规则有些不同:

■ 在分别使用原生MySQL INT和DOUBLE 数字类型的两个列之间的比较中,所有比较都涉及一个整数和一个双精度类型,因此所有行,整数都转换为双精度类型。也就是说,精确的数值被转换成近似的数值。

■ 另一方面,如果查询比较两个包含数字的JSON列,则无法预先知道数字是整数还是双精度。为了在所有行中提供最一致的行为,MySQL将近似值数字转换为精确值数字。结果排序是一致的,并且精确值不会丢失精度。例如,给定标量9223372036854775805、9223372036854775806、9223372036854775807和9.223372036854776e18,顺序如下:

技术图片

如果JSON比较使用非JSON数值比较规则,则可能会出现顺序不一致的情况。通常的MySQL数字比较规则会产生以下顺序:

■ 整数比较:
技术图片

■ 双精度比较:

技术图片

对于任何JSON值与SQL NULL的比较,结果是未知的。

为了比较JSON和非JSON值,非JSON值根据下表的规则转换为JSON,然后按照前面的描述进行比较。

在JSON和非JSON值之间的转换

下表汇总了MySQL在JSON值和其他类型值之间转换时遵循的规则:

技术图片

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值排序:

技术图片

如果有一个生成的列被定义为使用与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

MySQL数据类型 - JSON数据类型 (4)

原文地址:https://blog.51cto.com/15023289/2560978

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL数据类型 - JSON数据类型 (4)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL数据类型 - JSON数据类型 (4)

JSON值的比较和排序JSON值可以使用=,=,,!=,和运算符进行比较。JSON值尚不支持以下比较运算符和函数:●BETWEEN●IN()●GREATEST()●LEAST()要想使用上面这些列出的比较运算符和函数,一个解决方法是将JSON值转换为原生MyS

	MySQL数据类型 - JSON数据类型 (4)
2016-08-23

MySQL数据类型 - JSON数据类型 (2)

JSON值的规范化、合并和自动包装当一个字符串被解析并发现是一个有效的JSON文档时,它也会被规范化。这意味着,具有与稍后在文档中找到的键(从左到右)重复的键的成员将被丢弃。JSON_OBJECT()调用生成的对象值只包含第二个key1元素,因为该键名在之前值

	MySQL数据类型 - JSON数据类型 (2)
2019-09-03

MySQL数据类型 - JSON数据类型 (3)

最右边的数组元素。MySQL支持last关键字,作为数组中最后一个元素的索引的同义词。last - N 形式的表达式可用于相对寻址和范围定义,如下所示:如果不是针对数组计算路径,则求值结果与将该值包装在单个元素数组中的结果相同:可以使用带有JSON列标识符和J

	MySQL数据类型 - JSON数据类型 (3)
2021-03-13

MySQL数据类型 - 数据类型默认值

数据类型默认值数据类型规范可以有显式或隐式的默认值。数据类型规范中的DEFAULT值子句显式指示列的默认值。示例:SERIAL DEFAULT VALUE是一种特殊情况。在整数列的定义中,它是NOT NULL AUTO_INCREMENT UNIQUE的别名。

	MySQL数据类型 - 数据类型默认值
2021-04-15

MySQL学习笔记(4):数据类型

本文更新于2019-06-19,使用MySQL 5.7,操作系统为Deepin 15.4。目录数值类型整数类型定点数类型浮点数类型位类型日期时间类型字符串类型枚举类型集合类型数值类型整数类型type[(m)] [UNSIGNED] [ZEROFILL] [AU
MySQL学习笔记(4):数据类型
2019-09-06

Python--4 基本数据类型

4.1 字符串  字符串str是在Python编写程序过程中,最常见的一种基本数据类型。字符串是许多单个子串组成的序列,其主要是用来表示文本。字符串是不可变数据类型,也就是说你要改变原字符串内的元素,只能是新建另一个字符串。  1、创建py
2023-01-30

MySQL 数据类型

1、数值型类型                    范围、小数位数TINYINT(-128,127)SMALLINT正负3w+MEDIUMINT正负800w+INT正负21亿+BIGINT正负900千万亿+FLOAT  单精度10的-38次方DOUBLE 
MySQL  数据类型
2018-12-08

mysql数据类型

1.整型(整数类型)create table t2(id int(5) unsigned zerofill);注意:  ①int后面的5表示的是显示宽度(就是你select * from t2;时看到的数字最大长度为5),而不是数据库存储时的宽度,一般在创建表
mysql数据类型
2020-10-18

【MySQL】MySQL数据类型

文章目录 一、数据类型的分类二、tinyint类型2.1 创建有符号数值2.2 创建无符号数值 三、bit类型三、浮点类型3.1 float3.2 decimal类型 四、字符串类型4.1 char类型4.2 varchar
2023-08-22

MySQL5.7特性:JSON数据类型

什么是JSON类型 作为DBA,可能会对这个概念稍微有点陌生,但是对于开发者来说,这是一个十分熟悉的事物。 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算
MySQL5.7特性:JSON数据类型
2019-08-29

编程热搜

目录