当前位置: 首页 > news >正文

MySQL隐式类型转换

当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。有些转换是隐式发生的。例如,MySQL会根据需要自动将字符串转换为数字,反之亦然。
在这里插入图片描述
在这里插入图片描述

转换规则

  1. 如果一个或两个参数都为NULL,则比较结果为NULL 。但是相等比较运算符<=>除外,对于NULL<=>NULL,结果为1,不需要转换。

  2. 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较,不做类型转换。

  3. 如果两个参数都是整数,则将它们作为整数进行比较,不做类型转换。

  4. 十六进制的值和非数字做比较时,会被当做二进制串。

  5. 如果其中一个参数是TIMESTAMP或DATETIME列,而另一个参数为常量,则在执行比较之前,该常量将转换为时间戳。这样做是为了对ODBC更加友好。对于IN( ) 的参数,并没有这样做。为了安全起见,在进行比较时,请始终使用完整的日期时间、日期或时间字符串。例如,为了在将BETWEEN与日期或时间值一起使用时获得最佳结果。

  6. 来自一个或多个表的单行子查询不被视为常量。例如,如果子查询返回一个要与DATETIME 值进行比较的整数,则比较将作为两个整数进行。整数不会转换为时间值。要将操作数作为 DATETIME值进行比较,请使用 CAST()将子查询值显式转换为DATETIME。

  7. 如果其中一个参数是十进制值,则比较取决于另一个参数。如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较;如果另一参数是浮点值,则将其作为浮点值进行比较。

  8. 在所有其他情况下,参数将作为浮点(双精度)数字进行比较。例如,字符串和数字操作数的比较是作为浮点数的比较进行的。

带来的问题

1. 精度丢失导致查询结果错误

在这里插入图片描述

在这里插入图片描述

浮点数和整数类型的大值的比较是近似的,因为整数在比较之前被转换为双精度浮点数,不能准确表示所有 64 位整数。
例如,整数值 253 + 1 不能表示为浮点数,在进行浮点数比较之前四舍五入为 253 或 253 + 2,具体取决于CPU。

在这里插入图片描述

字符串和数字对比都会转化成double,varchar或 bigint 超过16位转化成 double时会出现精度丢失。

2. 参数类型和字段类型不一致时导致索引失效

在这里插入图片描述
当字段类型为字符串时参数类型为整数类型,导致索引失效
在这里插入图片描述

我们需要充分了解MySQL里隐式类型转换的规则,同时日常在写SQL时一定要检查参数类型与数据库字段类型是否一致,否则可能造成隐式类型转换,不能正常应用索引。

http://www.lryc.cn/news/61266.html

相关文章:

  • IT知识百科:什么是SSID?
  • OpenAI-ChatGPT最新官方接口《从0到1生产最佳实例》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(十一)(附源码)
  • 2023 IT市场权威榜单|美创数据库防火墙斩获“新一代信息技术创新产品”
  • 30个超级有用的JavaScript单行代码
  • 【GitLab私有仓库】在Linux上用Gitlab搭建自己的私有库并配置cpolar内网穿透
  • 诊断CAPL自动化(1)—— CANoe自带的诊断工程分析
  • 【dp】最长递增子序列
  • docker容器:Docker-Compose
  • 如何使用DNS实现融合CDN功能
  • 有关实现深拷贝的四种方法
  • Mysql 高可用部署实践
  • IEEE-TMI:张孝勇团队开发小鼠精细脑结构自动分割的深度学习算法
  • 八股文之面向对象和面向过程的区别
  • SpringBoot使用Redis实现分布式缓存
  • Three——二、加强对三维空间的认识
  • 【Java】Java8接口中方法区别和使用
  • WPF 控件库Live Charts 折线图多折线比较问题处理
  • 接口优化方案
  • 《商用密码应用与安全性评估》第二章政策法规2.1网络空间安全形式与商业密码工作
  • C#实现将文件、文件夹压缩为压缩包
  • 程序员跳槽,要求涨薪50%过分吗?
  • Java核心技术 卷1-总结-10
  • React Props
  • 【Hello Network】协议
  • 零项目零科研,本科排名倒数,一战上岸上海交大电子与通信工程
  • NOIP模拟赛 T3区间
  • 【Python】如何用pyth做游戏脚本(太简单了吧)
  • 【Linux】磁盘与文件系统
  • Transformer中的注意力机制及代码
  • ChatGPT在连续追问下对多线程和双重检查锁模式的理解--已经超越中级程序员