现象:
本来想要看一下数据库中有没有某字段为空的数据
结果使用select * from table where a=’‘查出来的结果a字段全是0,没有为空的,当然后来发现其实a字段是int类型的,自然也不存在为’'的情况。
但是这个现象之前没有发现过,引起了我的好奇心,于是有了如下测试
select 0=’'结果为1 | ![]() |
---|---|
select 0='0’结果为1 | ![]() |
select 0='A’结果为1 | ![]() |
select 0='1A’结果为0 | ![]() |
select 0='1’结果为0 | ![]() |
原因:
当比较数字和varchar类型的值时,mysql会进行类型转换,把varchar类型的转为数字类型来比较,首字符为0或者其他字符的都会被转换成0,使用0=varchar字符只能排除掉首字符为非零数字的字符串
当然,0和NULL进行比较的结果还是NULL这点是不会变的
具体原因可以看我另一篇关于mysql的NULL值比较陷阱博客.