> 文章列表 > mysql的隐式转换

mysql的隐式转换

mysql的隐式转换

概述

平时大家在使用mysql的时候发现即使字段类型是int但是拿字符串去查询也能查到。
背后自然是mysql帮我们转换了。
不过既然是自动转换的,那么有些时候就会遇到一些坑。

下面的demo中明显第二个例子是不相等的,但是mysql还是告诉了我们相等

mysql> SELECT '1801537632024345812' = 1801537632024345812;-> 1
mysql> SELECT '1801537632024345812' = 1801537632024345813;-> 1

隐式转换规则

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

demo
字符串和int类型字段比较,会将字符串转成浮点数
下面demo中可以发现字符串转成浮点数后的值已经出现误差了,所以大家在建立关联字段的时候一定要保证类型一致

SELECT cast('1801537632024345728' + 0.0 as unsigned);
+-----------------------------------------------+
| cast('1801537632024345728' + 0.0 as unsigned) |
+-----------------------------------------------+
|                           1801537632024345600 |
+-----------------------------------------------+1801537632024345728 -> 1100100000000010110001110111001101110010011110011110010000000
1801537632024345600 -> 1100100000000010110001110111001101110010011110011110000000000SELECT cast('1801537632024345984' + 0.0 as unsigned);
+-----------------------------------------------+
| cast('1801537632024345984' + 0.0 as unsigned) |
+-----------------------------------------------+
|                           1801537632024346112 |
+-----------------------------------------------+1801537632024345984 -> 1100100000000010110001110111001101110010011110011110110000000
1801537632024346112 -> 1100100000000010110001110111001101110010011110011111000000000