MySQL 避坑指南之隐式数据类型转换

作者 | 不剪发的Tony老师

责编 | 欧阳姝黎

出品 | CSDN博客

????知之为知之,不知为不知,是知也。——《论语》

今天我们来聊聊 MySQL 中存在的隐式数据类型转换以及可能带来的问题。

当两个不同类型的数据进行运算时,为了使得它们能够兼容,MySQL 可能会执行隐式的数据类型转换。例如,MySQL 在需要时会自动将字符串转换为数字,反之亦然。

mysql> SELECT 1+'1';-> 2
mysql> SELECT CONCAT(2,' test');-> '2 test'

我们也可使用 CAST() 函数将数字显式转换为字符串。CONCAT() 函数中的隐式类型转换是因为它只能接收字符串类型的参数。

mysql> SELECT 38.8, CAST(38.8 AS CHAR);-> 38.8, '38.8'
mysql> SELECT 38.8, CONCAT(38.8);-> 38.8, '38.8'

以下是比较运算中的类型转换规则:

如果任意一个参数为 NULL,比较的结果为 NULL,<=> 相等比较运算符除外。NULL <=> NULL 的运算结果为 true,不需要进行类型转换。

如果两个参数都是字符串,执行字符串比较。

如果两个参数都是整数,执行整数比较。

如果不是和数字进行比较,十六进制数值将被看作二进制字符串。

如果一个参数是 TIMESTAMP 或者 DATETIME 字段,另一个参数是常量,该常量将会在比较之前转换为时间戳类型。这一规则是为了更好地支持 ODBC 规范。IN() 运算符中的参数不会执行这一转换。为了保险起见,记得在执行比较运算时使用完整的日期时间、日期或者时间字符串。例如,在使用 BTWEEN 运算符判断日期或者时间数据时,利用 CAST() 函数将数据的类型显示转换成相应的类型。

返回单行结果的子查询不会被当作常量。例如,当一个返回整数的子查询和 DATETIME 数据进行比较时,DATETIME 将会被转换为整数类型,而不会将子查询的结果转换为时间类型。如果想要执行日期时间比较,可以使用 CAST() 函数显式将子查询的结果转换为 DATETIME 类型。

如果一个参数为精确数字类型(decimal),比较的方法取决于另一个参数的类型。如果另一个参数是精确数字或者整数类型,使用精确数字比较;如果另一个参数是浮点数类型,使用浮点数比较。

其他情况下,使用浮点数比较。例如,字符串和精确数字的比较使用浮点数比较方法。

关于时间类型之间的转换规则,可以参考官方文档。

以下示例演示了将字符串转换为数字的比较操作:

mysql> SELECT 1 > '6x';-> 0
mysql> SELECT 7 > '6x';-> 1
mysql> SELECT 0 > 'x6';-> 0
mysql> SELECT 0 = 'x6';-> 1

如果将字符串类型的字段和数字进行比较,MySQL 无法使用该字段上的索引快速查找数据。例如,str_col 是一个索引字段,该索引无法用于以下语句:

SELECT * FROM tbl_name WHERE str_col=1;

问题的原因在于很多不同的字符串都可以转换为数字 1,例如’1’、’ 1’ 或者 ‘1a’。

浮点数和 INTEGER 类型的超大数值之间的比较是近似比较,因为整数在比较之前需要转换为双精度浮点数,双精度浮点数无法精确地表示所有的 64 位整数。例如,整数 253 + 1 无法使用浮点数进行表示,只能近似为 253 或者 253 + 2。

举例来说,以下只有第一个比较运算中的两个值相等,但是两个比较运算都返回了 true(1):

mysql> SELECT '9223372036854775807' = 9223372036854775807;-> 1
mysql> SELECT '9223372036854775807' = 9223372036854775806;-> 1

字符串转换为浮点数与整数转换为浮点数的方式可能不同。整数可能使用 CPU 转换为浮点数,而字符串可能使用浮点数乘法进行逐位转换。另外,转换结果可能受到各种因素的影响,例如计算机的架构、编译器版本或者优化级别等。避免这种问题的方法之一就是使用 CAST() 函数,这样数据就不会被隐式转换为浮点数。

mysql> SELECT CAST('9223372036854775807' AS UNSIGNED) = 9223372036854775806;-> 0

关于浮点数比较的更多信息,可以参考官方文档。

MySQL 服务器提供了一个转换库 dtoa,可以支持字符串或者 DECIMAL 数据和近似数字(FLOAT/DOUBLE)之间的基本转换功能:

跨平台的一致性转换结果,例如,可以消除 Unix 和 Windows 之间的差异。

可以精确表示之前无法提供足够精度的数据,例如接近 IEEE 限制的数据。

以尽可能高的精度将数字转换成字符串格式。dtoa 的精度总是等于或者高于标准 C 代码库函数。

数字或者时间类型到字符串的隐式转换结果的字符集和排序规则取决于 character_set_connection 和 collation_connection 系统变量。(这些变量通常使用 SET NAMES 进行设置。关于连接的字符集的信息,可以参考官方文档。)

这意味着这种转换的结果是一个非二进制的字符串(CHAR、VARCHAR 或者 LONGTEXT),除非连接字符集被设置为 binary。此时,转换结果是一个二进制字符串(BINARY、VARBINARY 或者 LONGBLOB)。

对于整数类型的表达式,前文所述的表达式求值和表达式赋值有所不同。例如以下语句:

CREATE TABLE t SELECT integer_expr;

这种情况下,表 t 的字段类型取决于整数表达式的长度,可能是 INT 或者 BIGINT。如果表达式的最大长度超过了 INT,使用 BIGINT 类型。这就意味着我们可以通过一个足够长的表达式创建 BIGINT 类型的字段:

CREATE TABLE t SELECT 000000000000000000000 AS col;DESC t;
Field|Type  |Null|Key|Default|Extra|
-----+------+----+---+-------+-----+
col  |bigint|NO  |   |0      |     |

JSON 数据的比较分为两种情况。第一层次的比较基于被比较数据的 JSON 类型,如果两个类型不同,比较的结果取决于具有更高优先级的类型;如果两个数据的 JSON 类型相同,使用具体的类型规则进行第二层次的比较。对于 JSON 和非 JSON 数据的比较,先将非 JSON 数据转换为 JSON 类型,然后进行比较。详细信息可以参考官方文档。

作者简介:不剪发的 Tony 老师,CSDN 博客专家,CSDN 学院签约讲师, GitChat 专栏作者。十余年数据库管理与开发经验。目前在一家全球性的游戏公司从事数据库架构设计和开发工作,擅长各种数据库管理与 SQL 开发,拥有Oracle OCP 和 Redhat RHCE 证书。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二级java题型及分值_计算机二级java考试内容

计算机二级java考试内容Java支持快速原型和容易试验&#xff0c;它将导致快速程序开发。这是一个与传统的、耗时的“编译、链接和测试”形成鲜明对比的精巧的开发过程。下面是小编整理的关于计算机二级java考试内容&#xff0c;希望大家认真阅读!基本要求1.掌握Java语言的特点、…

淘宝直播在冲刺最复杂的人工智能技术!

01 上周&#xff0c;主播林珊珊测试了一下淘宝直播团队依据他个人形象打造的虚拟主播&#xff0c;也就是林珊珊下播以后&#xff0c;让虚拟主播上场&#xff0c;粉丝在直播间可以跟虚拟主播互动&#xff0c;虚拟主播则实时介绍商品&#xff0c;回答消费者提问。 第二天&#x…

2020双十一,阿里云GRTN拉开直播和RTC技术下半场的序幕

直播&#xff0c;已经成为了“剁手党”们最喜闻乐见的一种购物形式。对直播体验的极致追求&#xff0c;也是淘宝技术人们长期的努力方向。为了提升用户购物体验&#xff0c;让直播更加丝滑&#xff0c;让剁手更快一些&#xff0c;在2020双十一期间&#xff0c;淘宝首次启用了阿…

开拓新格局 共赢新 Power 2021浪潮商用机器新布局

6月25日&#xff0c;以“新格局新核心新Power”为主题的2021浪潮商用机器客户大会在沪隆重举行&#xff0c;本次大会吸引了来自证券、保险、医疗、制造、交通等重点行业的上百位客户代表以及ISV等渠道合作伙伴。会上&#xff0c;浪潮商用机器正式发布了面向关键计算的浪潮全新K…

大促场景系统稳定性保障实践经验分享

每到双11&#xff0c;如何保障系统高峰扛得住、长期平稳是每个大促人必须面对的问题。在今年双11之前&#xff0c;阿里云在上海举办了一场线下交流&#xff0c;阿里大促和稳定性保障负责人、中间件专家、解决方案专家等将历年总结的大促经验分享给参会嘉宾&#xff0c;我们选取…

考拉海购全面云原生迁移之路

今年 8 月底&#xff0c;入驻“阿里动物园”一周年的考拉海购首次宣布战略升级&#xff0c;在现有的跨境业务基础上&#xff0c;将重点从以“货”为中心变成以“人”为中心&#xff0c;全面发力会员电商。 外界不知道的是&#xff0c;对考拉海购来说&#xff0c;不只是完成了业…

新零售:从上云到云原生 Serverless

作者 | 七凌来源 | 阿里巴巴中间件头图 | 付费下载于 IC Photo某零售商超行业的龙头企业&#xff0c;其主要业务涵盖购物中心、大卖场、综合超市、标准超市、精品超市、便利店及无人值守智慧商店等零售业态&#xff0c;涉及全渠道零售、仓储物流、餐饮、消费服务、数据服务、金…

企业双11业绩增长156% 、成交额突破151亿元...... 这背后是阿里云数据中台的场景赋能

红星美凯龙天猫数字化卖场累计成交金额突破151.52亿元&#xff1b;杜蕾斯全网销售额突破1.7亿元&#xff0c;天猫官方旗舰店销售额同比增长105%&#xff1b;滴露全网销售额突破1.8亿元&#xff0c;天猫官方旗舰店销售额同比增长156%&#xff1b;波司登首铺准确率提升79%…… 在…

Gartner:2020年全球IaaS公有云服务市场增长40.7%

编辑 | 宋 慧 供稿 | Gartner 头图 | 付费下载于视觉中国 根据全球信息技术研究和顾问公司Gartner的统计结果&#xff0c;2020年全球基础设施即服务&#xff08;IaaS&#xff09;市场达到643亿美元&#xff0c;相比2019年的457亿美元增长40.7%。2020年亚马逊仍在IaaS市场排名第…

jmeter+mysql+set_jmeter学习指南之操作 mysql 数据库

JMeter 通过 JDBC Connection Configuration 和 JDBC Request 可以连接数据库&#xff0c;并进行增删改查操作&#xff0c;支持各种常见的数据库&#xff0c;本文以最常用的 MySQL 数据库为例讲解&#xff0c;其它数据库的使用方法类似。一、下载驱动包在使用之前&#xff0c;需…

如何快速实现精准的个性化搜索服务

简介&#xff1a; 用户行为数据如何实时的应用在搜索服务中那&#xff1f; 怎样在1天内就可实现【精准的个性化搜索系统】搭建那&#xff1f; 今天小编将通过【阿里云开放搜索】中的三大“个性化搜索算法模型”给大家详细介绍&#xff0c;希望给予您更多解决思路~ 一、个性化排…

写代码时发现......还得是 SpringBoot !一篇拿下

关注了很多技术类公众号的读者肯定有这样一个感受&#xff0c;SpringBoot相关的文章铺天盖地&#xff0c;并且SpringBoot相关的文章阅读量、收藏量都很高&#xff0c;这也从侧面反映了SpringBoot技术的火爆。一切都在证明&#xff0c;SpringBoot已经成为了Java程序员必备的技能…

当 TiDB 与 Flink 相结合:高效、易用的实时数仓

简介&#xff1a; 利用实时数仓&#xff0c;企业可以实现实时 OLAP 分析、实时数据看板、实时业务监控、实时数据接口服务等用途。但想到实时数仓&#xff0c;很多人的第一印象就是架构复杂&#xff0c;难以操作与维护。而得益于新版 Flink 对 SQL 的支持&#xff0c;以及 TiDB…

云原生时代微服务的高可用架构设计

简介&#xff1a; 在8月20日“阿里巴巴技术质量精品课”上&#xff0c;来自蚂蚁的经国分享了对云原生时代微服务的高可用架构设计的全面解析&#xff0c;为大家介绍了应用架构演进路径、云原生时代的技术福利、高可用架构的设计原则以及经典案例的设计。 演讲嘉宾简介&#xf…

“精耕细作”桌面云市场的锐捷,重磅发布三擎云桌面

编辑 | 宋 慧 出品 | CSDN云计算 头图 | 付费下载于IC photo 在教育行业VDI与桌面云具有优势的锐捷&#xff0c;仍在不断扩充自身技术与产品方案的实力。 6月30日&#xff0c;锐捷正式对外发布新一代云桌面解决方案——锐捷三擎云桌面解决方案。会上针对三擎云桌面的终端云化…

Flink 1.11 与 Hive 批流一体数仓实践

导读&#xff1a;Flink 从 1.9.0 开始提供与 Hive 集成的功能&#xff0c;随着几个版本的迭代&#xff0c;在最新的 Flink 1.11 中&#xff0c;与 Hive 集成的功能进一步深化&#xff0c;并且开始尝试将流计算场景与Hive 进行整合。 本文主要分享在 Flink 1.11 中对接 Hive 的新…

双11还能创造什么新技术?

简介&#xff1a; 当下购物峰值不再是最大挑战&#xff0c;下一代技术创新将会出现在哪里&#xff1f; 诞生12年后&#xff0c;双11仍然续写答卷&#xff0c;也留下了问卷&#xff1a;当购物峰值不再是最大挑战&#xff0c;下一代技术创新&#xff0c;将会出现在哪里&#xff1…

于变局中开新局!《2021中国SaaS市场研究报告》报告发布

我国SaaS市场即将步入成熟需求&#xff0c;一起跟上&#xff01; 中国市场数字化发展已经历了部门级信息化&#xff08;2005年以前&#xff09;、企业级信息化&#xff08;2006-2015年&#xff09;、产业级数字化&#xff08;2016-2020年&#xff09;三个阶段&#xff0c;在20…

4982亿背后的前端技术—2020天猫双11前端体系大揭秘

简介&#xff1a; 整体介绍一下淘系前端在今年双11的思考和沉淀。 今年双11的整体节奏从之前的“光棍节”变为“双节棍”&#xff0c;具体业务上也有很多变化和调整&#xff0c;应了阿里的土话“唯一不变的是变化”。面对这些变化&#xff0c;是挑战也是机会&#xff0c;我们要…

从应用开发角度认识 K8S

简介&#xff1a; 作者个人介绍 刘晨 Lorraine 坐标Fintech&#xff0c;精通持续集成与发布&#xff0c;曾具有全平台100应用持续部署持续发布实战经验&#xff0c;现在立志于成为K8S玩家。 云原生应用 我们正经历从单体应用转向分布式微服务架构应用的技术趋势。分布式微服务…