MySQL类型隐式转换

近日在写业务时遇到一个BUG,根据条件查询数据时明明这个条件不成立却还是能查到数据,正因为这个问题我花了一个下午去排查,第一怀疑的会不会是MyBatis缓存问题,然后又在想是不是因为开启了Spring的事务原因,最后无意间在对条件加了单引号和不加单引号的情况下发现了问题所在,经了解,原来是MySQL的类型隐式转换机制。
原始数据
表结构
在tbl_user表中有三条数据,表中有5个字段,接下来我们根据account字段来查询数据
查询结果
我们想要查询的明明只是account字段值为1712362108403900421的数据,但是却查到了三条数据,这是为什么?

原因是MySQL有隐式类型转换,在tbl_user表中的account字段是varchar类型,但是我们sql语句中条件却没有带上单引号,所以就是数值类型,这种情况下MySQL会将条件值和表中account字段的值都转换成double类型后再进行比较。
转换成Double结果
将查询到的数据的account字段的值通过java代码转换成double类型后发现它们结果是一样的。
带上单引号查询结果
当带上单引号时查询结果是符合预期的,因为条件的和目标字段值都是字符串类型,不需要转换成double类型。

tips:在日常开发中写SQL时一定要注意字段类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被代码耽误的米其林大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值