一、背景
从一条sql引起线上事故说起,看一眼SQL语句(topic_key为varchar类型):
SELECT * FROM topic WHERE topic_key IN ('123213', 0);
结果(只取了部分结果集):
欲操作SQL:
SELECT * FROM topic WHERE topic_key IN ('123456', '0');
欲得到结果:
二、分析
1.'0’和0有什么区别?
就是简单的字符串0和数字0的区别,我们知道IN关键字就是=ALL(集合),即='0’只会查出为内容为0的记录,多查出的数据,即=0的数据后面说道。
2.为什么会多查出一部分数据?
这我们就得从MySQL的隐式转换说起,我们欲根据字符串查询,正常查询参数应该是字符串类型,如果写成数字类型,则MySQL会对查询参数做隐式转换,对结果集给出查询参数类型的隐式转换,文字理解无趣,下面看一条SQL:
SELECT topic_key, CAST(topic_key AS UNSIGNED) AS implicit_value FROM topic;
结果:
(1)CAST(expr AS type)是内置函数,把字符串转换成对应整数值
(2)UNSIGNED表示无符号,这个不知道可以自行先了解下,不是本文重点
由上数据集,我们可以看出纯数字的字符串转换成对应数字,字符串都会转成0,所以我们就能知道为什么会多出数据,多的数据都是字符串值
三、总结
1.数据库操作很重要,写SQL一定要细心、严谨
2.对于字符串参数查询一定要按照规定格式来,加上’‘是基本操作,索引地方也是如此,少了’'索引也会失效