Mysql INT和CHAR类型的隐式转换

最近碰到一个问题,由于没有对参数进行过滤和转换,直接拿到mysql里面进行查询了,大概是这样的:

select * from store where id='1}';
select * from store where id='{1}';#测试

但是前者仍然可以查出id为1的记录,后者是不行。知道mysql有隐式转换却不知道具体是怎么样的。google了下,发现隐式转换还有其他的问题,例如:

select * from store where name=0;
select * from store where name='0';

前者将会查询出所有的记录,而后者只会匹配name值为0的记录。
总结了一下大概是这些大概是以下的原因:

  • 当查询字段是INT类型,如果查询条件为CHAR,将查询条件转换为INT,如果是字符串前导都是数字将会进行截取,如果不是转换为0。
  • 当查询字段是CHAR类型,如果查询条件为INT,将查询字段为换为INT再进行比较,可能会造成全表扫描。示例2的name字段为CHAR类型,第一句查询转换为INT时都等于0,所以全部匹配了;第二句查询同为CHAR类型不发生转换,所以仅匹配值为0的记录。

mysql的隐式转换还有很多其他的坑,所以一定要指明查询条件类型,不要让mysql去做自动转换。

参考链接:
价值百万的 MySQL 的隐式类型转换
mysql字符串的隐式转换导致数据库操作异常
关于mysql 隐式转换的一个小问题
MySQL查询类型不正确不使用索引?
mysql的隐式的数据类型转换
MySQL隐式转换之坑
列类型

发表评论

电子邮件地址不会被公开。 必填项已用*标注