现象:
本来想要看一下数据库中有没有某字段为空的数据
结果使用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值比较陷阱博客.

在MySQL中,当你尝试用数字与varchar类型字段进行比较时,数据库会自动进行类型转换。例如,`select 0 = 'A'`返回1,因为varchar被转换为数字0。这个现象涉及到MySQL的隐式类型转换规则,可能导致意外的结果。了解这个陷阱对于避免在查询中出现错误至关重要。转换规则是,首字符为非零数字的varchar字符串在转换时会被认为是数字,否则转换为0。





5万+

被折叠的 条评论
为什么被折叠?



