Mysql
MySQL 5.7 中的瘋狂自動浮點舍入
我確切的 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、…)或定點類型(十進制、數字)。由於您沒有說您使用這些數字來表示什麼,我們無法提出更具體的建議。