• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

MySQL诡异的更新操作

MySQL FAQ 彭东稳 3年前 (2019-03-12) 9279次浏览 已收录 0个评论

这几天线上出现一个诡异的更新问题,看下面这个测试案例,主看看表结构及更新结果。

我明明想更新一行,但更新了三行。也就是说 c = 20190309000002958094 匹配上了 20190309000002958095 和 20190309000002958096 的值。

其主要原因还是更新条件由于忘记指定为字符串了,在 MySQL 内部产生了隐式转换。所以可以看出隐式转换不光会造成无法使用索引,还会导致数据更新出现非理想情况(推荐使用 SOAR 工具对你的 SQL 进行检测,评测结果会告诉你产生了隐式转换)。

跟一个朋友 @韩川川 讨论验证之后,感觉应该是把 string 转换为了 double 类型(网上也有很多此类错误 Truncated incorrect DOUBLE value),double 是双精度非准确浮点类型,当超过一定长度后会进行四舍五入。验证方式如下。

从结果来看,插入的值虽然不同,但存入 double 后都变成一样的了,也就是间接说明了前面为什么会把所有相关值都匹配上。我们直接对比数值和字符串看看结果。

值虽然不同,但由于一个是数值,一个是字符串,MySQL 比较之后认为是相等的。

以上推测可能不正确的,也没有再深入的能力了。如果有更详细和正确的答案,欢迎指教。

<参考>

https://dev.mysql.com/doc/refman/5.7/en/type-conversion.html


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (0)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!