排行
数据库百科
核心案例
行业报告
月度解读
大事记
产业图谱
中国数据库
向量数据库
时序数据库
实时数据库
搜索引擎
空间数据库
图数据库
数据仓库
大调查
2021年报告
2022年报告
年度数据库
2020年openGauss
2021年TiDB
2022年PolarDB
2023年OceanBase
首页
资讯
活动
大会
学习
课程中心
推荐优质内容、热门课程
学习路径
预设学习计划、达成学习目标
知识图谱
综合了解技术体系知识点
课程库
快速筛选、搜索相关课程
视频学习
专业视频分享技术知识
电子文档
快速搜索阅览技术文档
文档
问答
服务
智能助手小墨
关于数据库相关的问题,您都可以问我
数据库巡检平台
脚本采集百余项,在线智能分析总结
SQLRUN
在线数据库即时SQL运行平台
数据库实训平台
实操环境、开箱即用、一键连接
数据库管理服务
汇聚顶级数据库专家,具备多数据库运维能力
数据库百科
核心案例
行业报告
月度解读
大事记
产业图谱
我的订单
登录后可立即获得以下权益
免费培训课程
收藏优质文章
疑难问题解答
下载专业文档
签到免费抽奖
提升成长等级
立即登录
登录
注册
登录
注册
首页
资讯
活动
大会
课程
文档
排行
问答
我的订单
首页
专家团队
智能助手
在线工具
SQLRUN
在线数据库即时SQL运行平台
数据库在线实训平台
实操环境、开箱即用、一键连接
AWR分析
上传AWR报告,查看分析结果
SQL格式化
快速格式化绝大多数SQL语句
SQL审核
审核编写规范,提升执行效率
PLSQL解密
解密超4000字符的PL/SQL语句
OraC函数
查询Oracle C 函数的详细描述
智能助手小墨
关于数据库相关的问题,您都可以问我
精选案例
新闻资讯
云市场
登录后可立即获得以下权益
免费培训课程
收藏优质文章
疑难问题解答
下载专业文档
签到免费抽奖
提升成长等级
立即登录
登录
注册
登录
注册
首页
专家团队
智能助手
精选案例
新闻资讯
云市场
微信扫码
复制链接
新浪微博
分享数说
采集到收藏夹
分享到数说
首页
/
MySQL数据类型 - JSON数据类型 (4)
MySQL数据类型 - JSON数据类型 (4)
数据库杂货铺
2021-04-12
679
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转换规则
其他类型
CAST(其他类型 AS JSON)
CAST(JSON AS 其他类型)
JSON
没有变化
没有变化
utf8 字符类型 (
utf8mb4
,
utf8
,
ascii
)
字符串解析为JSON 值。
JSON 序列化为
utf8mb4
字符串。
其他字符类型
其他字符编码隐式转换为utf8mb4,并按utf8字符类型的描述进行处理。
JSON 值序列化为
utf8mb4
字符串,然后转换为其他字符编码。结果可能没有意义。
NULL
结果为JSON 类型的
NULL
值。
不适用。
Geometry 类型
通过调用
ST_AsGeoJSON()
将几何值转换成JSON 文档。
非法操作。变通办法:将
CAST(
json_val
AS CHAR)
结果传递给
ST_GeomFromGeoJSON()
。
所有其他类型
结果生成一个由单个标量值组成的JSON文档。
如果JSON文档包含目标类型的单个标量值,并且该标量值可以强制转换为目标类型,则成功。否则,返回NULL并生成警告。
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
文章转载自
数据库杂货铺
,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
领墨值
有奖问卷
意见反馈
客服小墨