MySQL-数据类型隐式转换

总结摘要
MySQL Implicit Type Conversion

MySQL数据类型隐式转换

隐式转换是 MySQL 在比较或操作不同数据类型时自动进行的类型转换,主要发生在比较运算、算术运算和函数处理等场景。

规则

  1. 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换
  2. 两个参数都是字符串,会按照字符串来比较,不做类型转换
  3. 两个参数都是整数,按照整数来比较,不做类型转换
  4. 十六进制的值和非数字做比较时,会被当做二进制串
  5. 有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp
  6. 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
  7. 所有其他情况下,两个参数都会被转换为浮点数再进行比较

MySQL 的隐式转换虽然方便,但容易导致:

  • 性能下降(索引失效)
  • 逻辑错误(意外的匹配结果)
  • 精度丢失(数据截断)
  • 安全风险(SQL注入)

异常场景

1
2
3
-- 字符串与数字比较,字符串转为0
SELECT 'password' = 0;  -- 返回1(true)
SELECT 'password' = 'pwd'; -- 返回0(false)

参考资料

Type Conversion in Expression Evaluation

https://dev.mysql.com/doc/refman/8.0/en/type-conversion.html

浅析 MySQL 的隐式转换

https://xiaomi-info.github.io/2019/12/24/mysql-implicit-conversion/

价值百万的 MySQL 的隐式类型转换

https://www.cnblogs.com/apple99/articles/8724206.html

MySQL隐式转化整理

https://developer.aliyun.com/article/39477

END