MySQL 的隐式转换

背景

当我们对不同类型的值进行比较的时候,MySQL为了使得这些数值可比较(也可以称为类型的兼容性), 会自动做一些隐式转换(Implicit type conversion)那么,mysql是怎么进行类型转换的呢?
官方文档:表达式求值中的类型转换

1. 字符串转数字:

  1. 若字符串是以数字开头,并且全部都是数字,则转换的数字结果是整个字符串;部分是数字,则转换的数字结果是截止到第一个不是数字的字符为止
  2. 若字符串不是以数字开头,则转换的数字结果是 0
select '123abc' + 1 // 124
select 'abc123' + 2 // 2
select 2 > '1' // 1
select 2 > '3' // 0
select 2 > '3a' // 0
select 2 > '1a' // 1
select 0 = 'x6' // 1

隐式转换的规则:

  • 如果一个或两个参数是NULL,则比较的结果是NULL,但 <=>相等比较运算符除外。对于NULL <=> NULL,结果为真,无需转换。

  • 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。

  • 如果两个参数都是整数,则将它们作为整数进行比较。

  • 如果不与数字比较,十六进制值将被视为二进制字符串。

  • 如果其中一个参数是TIMESTAMPDATETIME列,而另一个参数是常量,则在执行比较之前将常量转换为时间戳。为了安全起见,在进行比较时,请始终使用完整的日期时间、日期或时间字符串。例如,要在使用BETWEEN日期或时间值时获得最佳结果,请使用CAST()将值显式转换为所需的数据类型。

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

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

你可能感兴趣的:(MySQL 的隐式转换)