MySQL INT和CHAR隐式类型转换需要注意什么?

183 3月之前 MySQL

答案

主要需要记住下面两点:

  1. 查询字段INT类型,如果查询条件CHAR,将查询条件转换为INT,如果是字符串前导都是数字,将截取前导数字用来比较,如果没有前导数字,则转换为0
  2. 查询字段CHAR/VARCHAR类型,如果查询条件INT,将查询字段为换为INT再进行比较,可能会造成全表扫描

答案解析

有如下一张测试表productidint类型,namevarchar类型。

+----+--------+
| 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 |
+----+--------+