我确切的 MySQL 版本是5.7.29-0ubuntu0.18.04.1
. 我开始觉得我快疯了...
试试这些查询:
CREATE TABLE `float_bug` (
`v` FLOAT NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO float_bug VALUES(92160596);
SELECT * FROM float_bug;
退货92160600
。
然后我尝试了这些:
SELECT * FROM float_bug WHERE v = 92160596;
SELECT * FROM float_bug WHERE v BETWEEN 92160596 AND 92160600;
两者都不返回!
然而这
SELECT * FROM float_bug WHERE v = 92160592;
退货92160600
。
我准备把我的电脑扔到墙上,但不幸的是,这无济于事,因为我的远程服务器上的行为完全相同,而且我不能将它物理地扔到墙上。
有什么想法吗?
这不仅仅是 SQL 的事情:在任何语言中,浮点数都应该被视为近似值。请参阅https://floating-point-gui.de/以及其他参考资料。
您可以改用 DOUBLE 类型,这会有所帮助,因为它可以准确地表示长度最多为 53 位的整数,但是稍后您会遇到更大的数字问题。
除非您绝对必须有浮点数,否则应避免使用这些类型。请改用整数(int、bigint、...)或定点类型(十进制、数字)。由于您没有说您使用这些数字来表示什么,我们无法提出更具体的建议。
事实证明我找到了答案:))
https://dba.stackexchange.com/a/144990/172761
太糟糕了,官方 MySQL 文档中没有说明。至少在查看了所有关于浮点数的文章后我找不到它。