最近碰到一个问题,由于没有对参数进行过滤和转换,直接拿到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隐式转换之坑
列类型