MySQL 的隐式转换

当我们对不同类型的值进行比较的时候,为了使得这些数值可比较(也可以称为类型的兼容性),MySQL 会做一些隐式转换(Implicit type conversion):

  • 若字符串是以数字开头,并且全部都是数字,则转换的数字结果是整个字符串;部分是数字,则转换的数字结果是截止到第一个不是数字的字符为止
  • 若字符串不是以数字开头,则转换的数字结果是 0
varchar str = "123dafa" // 转换为数字是 123
SELECT '123dafa' + 1; // 124
varchar str = "aabb33" // 转换为数字是 0
SELECT 'aabb33' + 100; // 100
SELECT 1 + '1'; // 2
SELECT CONCAT(2, ' test'); // '2 test'

隐式转换规则

MySQL 官方文档中关于隐式转化的规则是这样描述的:

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

版权声明:本文为qq_43665821原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。