Mysql隐式类型转换方式
一、实例操作
如下图user表结构

查询语句1
![]()
- 执行结果:
![]()
查询语句2
![]()
- 执行结果:
![]()
查询语句3
![]()
- 执行结果:
![]()
查询语句4
![]()
- 执行结果:
![]()
- 结果分析:
从上面四则查询语句中可以看出 mobile的字段为字符类型时,当查询时等式是字符类型和数字类型时执行结果不一致,而status的字段为数字类型,当查询时等式是字符类型和数字类型时执行结果一致。
这是为什么呢?
二、mysql 隐式类型转换
上述案例其真实的原因时mysql的隐式类型转换,那什么是隐式类型转换呢?
1. 隐式类型转换规则
- 如果一个或两个参数均为NULL,则比较的结果为NULL,除了 相等比较运算符。对于NULL NULL,结果为true。
- 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。
- 如果两个参数都是整数,则将它们作为整数进行比较。
- 如果不与数字比较,则将十六进制值视为二进制字符串。
- 如果参数之一是 timestamp 或 datatime column,而另一个参数是常量,则在执行比较之前,该常量将转换为时间戳。
- 如果参数之一是十进制值,则比较取决于另一个参数。如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较;如果另一个参数是浮点值,则将参数作为浮点值进行比较。
- 在所有其他情况下,将参数作为浮点数(实数)进行比较。例如,将字符串和数字操作数进行比较,将其作为浮点数的比较。
通过隐式类型转换可以得出上述示例的结果:当查询中有数字时那么会将字符串转化成数字进行比较。
所以当你的列为字符串时那么需要将列中字符串进行类型格式转换而进行字符格式转换之后则与索引不一致;
当你的列为数字时查询等式为字符串时只是把查询的常量转成数字并不影响列的类型所以依然可以使用索引并没有破坏索引的类型。
2. 隐式类型转换实例
![]()

3. 避免隐式类型转换
可以使用内置函数对类型强制性转换
- case( value as type)
- conver(value,type)
我们需要充分了解吗MySQL里隐式类型转换的规则,同时我们日常在写SQL时一定要检查参数类型与数据库字段类型是否一致,否则可能造成隐式类型转换,不能正常应用索引,造成慢查询,甚至拖垮整个数据库服务集群。
如果参数不一致,也可以考虑使用CAST函数显性转换成一致类型。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
MySQL/Postgrsql 详细讲解如何用ODBC接口访问MySQL指南
2008-01-01
Linux连接mysql报错:Access denied for user ‘root’@‘localhost’(usi
这篇文章主要给大家介绍了关于Linux连接mysql数据库报错:Access denied for user ’root‘@’localhost‘(using password: YES)的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。2018-01-01
MySQL系统库之information_schema的实现
information_schema用于存储数据库元数据,本文主要介绍了MySQL系统库之information_schema的实现,具有一定的参考价值,感兴趣的可以了解一下2023-11-11
Mysql 5.6使用配置文件my.ini来设置长时间连接数据库的问题
这篇文章主要介绍了Mysql 5.6使用配置文件my.ini来设置长时间连接数据库,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-07-07


最新评论