MySQL类型隐式转换规则

时间:2022-06-01 13:01:12

在MySQL语句里,如果操作符应用于不同的类型的操作数,为了兼容让操作数兼容,MySQL会对操作数做类型转换,有些是自动的隐式转换。

“+”号操作符

使用“+”号相加的是字符串或字符串和数字,字符串会隐式转换为数字。

以数字开头的字符串

以数字开头的字符串,它会截取前面的数字字符串,转换为对应的数字。

mysql> select '1a' + 1;
+----------+
| '1a' + 1 |
+----------+
|    2 |
+----------+
1 row in set, 1 warning (0.00 sec)

字符串'1a'转换为数字1。并且有一条警告提示。

mysql> show warnings;
+---------+------+----------------------------------------+
| Level  | Code | Message                |
+---------+------+----------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '1a' |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)

使用show  warnings查看警告,提示Truncated incorrect DOUBLE value: '1a',意思是对‘1a’做了截取

以字符开头的字符串

以字符开头的字符串,使用加号相加时会把字符串转换为0。

mysql> select 'a1' + 1; 
+----------+
| 'a1' + 1 |
+----------+
|    1 |
+----------+
1 row in set, 1 warning (0.00 sec)

这里把“1a”改为“a1”,字符串“a1”被转换为了0。

字符连接函数CONCAT()

mysql> SELECT CONCAT(1,' test'); 
+-------------------+
| CONCAT(1,' test') |
+-------------------+
| 1 test      |
+-------------------+
1 row in set (0.03 sec)

使用CONCAT函数连接多个字符串时,对于数字,它会自动隐式转换为字符串。

比较操作符

使用比较操作符比较数字与字符串时,字符串类型会隐式转换为数字。

示例

mysql> SELECT 1 > '6x';
0
mysql> SELECT 7 > '6x';
1
mysql> SELECT 0 = 'x6';
        -> 1
mysql> SELECT 'a' = '0';
0

使用>,<,=比较符比较数字和字符串,字符串转换为数字遵从:

  1. 以数字开头的字符串,截取前面的数字字符串,转换为对应的数字
  2. 以字符开头的字符串,字符串即使包含了数字,也会转换为0。
  3. 字符串与字符串的比较,即使是纯数字的字符串,这种情况下不做类型转换,如例子里的'a' = '0'

Where语句里的隐式转换

在Where语句里使用

SELECT * FROM tbl_name WHERE str_col=数字;

示例

SELECT * FROM user WHERE name = 0;

由于等式比较name=0,name会自动转换为0,所以name=0的结果为true。SELECT 语句会返回所有的数据。