MySQL INT和CHAR隐式类型转换需要注意什么?
答案
主要需要记住下面两点:
1.当查询字段是
INT
类型,如果查询条件为CHAR
,将查询条件转换为INT
,如果是字符串前导都是数字,将截取前导数字用来比较,如果没有前导数字,则转换为0
。2.当查询字段是
CHAR/VARCHAR
类型,如果查询条件为INT
,将查询字段为换为INT
再进行比较,可能会造成全表扫描。
答案解析
有如下一张测试表product
,id
为int
类型,name
为varchar
类型。
+----+----------+
| id | name |
+----+----------+
| 1 | apple |
| 2 | banana |
| 3 | 99cat |
+----+----------+
情况1:
// 查询条件转化为数字1再比较
mysql> select * from product where id = '1abc23';
+----+---------+
| id | name |
+----+---------+
| 1 | apple |
+----+---------+
情况2:
// 查询字段全部转化成数字,id:1和id:2字段值转化为0,id:3转化成99,再比较
mysql> select * from product where name=0;
+----+----------+
| id | name |
+----+----------+
| 1 | apple |
| 2 | banana |
+----+----------+