程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了MySQL 精确匹配不适用于 17 位 CONCAT大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决MySQL 精确匹配不适用于 17 位 CONCAT?

开发过程中遇到MySQL 精确匹配不适用于 17 位 CONCAT的问题如何解决?下面主要结合日常开发的经验,给出你关于MySQL 精确匹配不适用于 17 位 CONCAT的解决方法建议,希望对你解决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 的每个组合返回三行。

如果我将 LPAD 减少到 6,我似乎没有问题。

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) 吗?

解决方法

@H_674_34@

@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,请注明来意。
标签:17