大佬教程收集整理的这篇文章主要介绍了MySQL 精确匹配不适用于 17 位 CONCAT,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 MysqL 中运行的查询中有一个不寻常的重复问题。
SELECT pg.filename,pg.taken,pg.event as event_ID,pg.ID,CONCAT(UNIX_timestAMP(pg.taken),LPAD(pg.ID,7,0)) as uniq
from photogallery pg
WHERE CONCAT(UNIX_timestAMP(pg.taken),0)) = 15074515800000516
这个查询应该只返回一行(因为 CONCAT 和 LPAD 函数是结合日期和 ID 的形式,主键。
但是它返回了三行。但是,它不会为 CONCAT 和 LPAD 的每个组合返回三行。
CONCAT / LPAD 函数生成 17 位数字,但我在网上阅读的内容似乎并未表明这应该是导致结果重复的问题?
我知道日期是一样的,但 ID 不是,所以这个数字仍然是唯一的...?
示例数据集:
filename taken event_ID ID
1973-213.jpg 2017-10-08 08:33:00 1973 515
1973-214.jpg 2017-10-08 08:33:00 1973 516
1973-215.jpg 2017-10-08 08:33:00 1973 517
我得到的结果(不正确,应该只得到 ID 为 516 的行...)
filename taken event_ID ID uniq
1973-213.jpg 2017-10-08 08:33:00 1973 515 15074515800000515
1973-214.jpg 2017-10-08 08:33:00 1973 516 15074515800000516
1973-215.jpg 2017-10-08 08:33:00 1973 517 15074515800000517
编辑:这可能是因为我的表结构将 ID 设置为 int(11) 吗?
@Akina 说得对。你比较数字。并且因为 17 位数字对于标准有符号 INT
来说是非常大的,它可以容纳最大 2147483647
,所以数字被强制转换为 DOUBLE
。标准 DOUBLE
具有 15 位精度,因此 17 位数字四舍五入。
好的,现在你问如果 DOUBLE
有 15 位精度,为什么我的 16 位数字没有四舍五入?实际上,DOUBLE
具有精确的 53 个二进制数字精度,即 15.95 个十进制数字,因此很少出现 16 位数字的四舍五入。
更多关于 MySQL 手册中的类型转换:12.3 Type Conversion in Expression Evaluation
更多关于浮点数(如维基百科中的 DOUBLE
):IEEE 754
以上是大佬教程为你收集整理的MySQL 精确匹配不适用于 17 位 CONCAT全部内容,希望文章能够帮你解决MySQL 精确匹配不适用于 17 位 CONCAT所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。