MySQL类型隐式转换规则
在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
使用>,<,=比较符比较数字和字符串,字符串转换为数字遵从:
- 以数字开头的字符串,截取前面的数字字符串,转换为对应的数字
- 以字符开头的字符串,字符串即使包含了数字,也会转换为0。
- 字符串与字符串的比较,即使是纯数字的字符串,这种情况下不做类型转换,如例子里的'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 语句会返回所有的数据。