Mysql

MySQL 5.7 中的瘋狂自動浮點舍入

  • March 11, 2020

我確切的 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

我準備把我的電腦扔到牆上,但不幸的是,這無濟於事,因為我的遠端伺服器上的行為完全相同,而且我不能將它物理地扔到牆上。

有什麼想法嗎?

事實證明我找到了答案:))

https://dba.stackexchange.com/a/144990/172761

FLOAT儲存 24 個有效位的數據(相當於大約7 個十進制數字;儲存 = 4 個字節),指數範圍約為 10 ** +/-38。

太糟糕了,官方 MySQL 文件中沒有說明。至少在查看了所有關於浮點數的文章後我找不到它。

這不僅僅是 SQL 的事情:在任何語言中,浮點數都應該被視為近似值。請參閱https://floating-point-gui.de/以及其他參考資料。

您可以改用 DOUBLE 類型,這會有所幫助,因為它可以準確地表示長度最多為 53 位的整數,但是稍後您會遇到更大的數字問題。

除非您絕對必須有浮點數,否則應避免使用這些類型。請改用整數(int、bigint、…)或定點類型(十進制、數字)。由於您沒有說您使用這些數字來表示什麼,我們無法提出更具體的建議。

引用自:https://dba.stackexchange.com/questions/261672