近日在写业务时遇到一个BUG,根据条件查询数据时明明这个条件不成立却还是能查到数据,正因为这个问题我花了一个下午去排查,第一怀疑的会不会是MyBatis缓存问题,然后又在想是不是因为开启了Spring的事务原因,最后无意间在对条件加了单引号和不加单引号的情况下发现了问题所在,经了解,原来是MySQL的类型隐式转换机制。
在tbl_user表中有三条数据,表中有5个字段,接下来我们根据account字段来查询数据
我们想要查询的明明只是account字段值为1712362108403900421的数据,但是却查到了三条数据,这是为什么?
原因是MySQL有隐式类型转换,在tbl_user表中的account字段是varchar类型,但是我们sql语句中条件却没有带上单引号,所以就是数值类型,这种情况下MySQL会将条件值和表中account字段的值都转换成double类型后再进行比较。
将查询到的数据的account字段的值通过java代码转换成double类型后发现它们结果是一样的。
当带上单引号时查询结果是符合预期的,因为条件的和目标字段值都是字符串类型,不需要转换成double类型。
tips:在日常开发中写SQL时一定要注意字段类型。