执行show
语句看一下一个普通表的结构:
1 | SHOW CREATE TABLE test.user; |
输出:
1 | CREATE TABLE `user` ( |
注意到这里id
字段是bigint
类型,那么如果我查询记录时where
条件判断id
等于一个字符串会怎样呢?来试一下:
1 | SELECT * FROM test.user WHERE id = '1-fad'; |
输出:
可以发现竟然查出来了,而且简单对比一下,感觉查出来的id
就是字符串中的1
啊,那么是为什么呢,其实mysql针对这种需要类型转换的时候进行了隐式转换,像字符串转为int
呢方法就是将字符串从前向后截取到非数字的地方,然后把后面全部改成0并求和,相当于转化的值就是第一个非数字的位置前面代表的数字.
这里后来也发现了一个其他的问题,就是在查看执行计划时发现如果截取的数字超过字段对应的类型的话是不会查询的,来比较一下:
在范围内的情况:
1 | EXPLAIN SELECT * FROM test.user WHERE id = '1-fad'; |
超过范围的情况:
1 | EXPLAIN SELECT * FROM test.user WHERE id = '1231231231231-fad'; |
结果显而易见,各项都是空,mysql直接返回结果