2016-09-30 32 views
0

我有一個表的字段DECIMAL(9,2),我已經跑了MySQL 5.7MySQL配置爲自動截斷十進制值

2臺服務器如果我運行此代碼

INSERT INTO `money_accounts` (`balance`) VALUES (9999999999.99); 

在一臺服務器它插入並且值被截斷,另一方面它引發了一個Out of range value for column balance錯誤。

我的問題是,使這種情況發生的配置值是什麼?或者爲什麼它發生在一臺服務器上而不是另一臺服務器上?

回答

1

如果我們閱讀文檔:http://dev.mysql.com/doc/refman/5.7/en/out-of-range-and-overflow.html

當MySQL存儲在數字列是列數據類型的 容許範圍外的值,結果取決於 當前有效的SQL模式

如果啓用嚴格SQL模式,MySQL會拒絕超出範圍的值 並顯示錯誤,並且插入失敗,符合SQL 標準。

如果沒有啓用限制模式,MySQL會將該值剪切到該範圍的適當端點 ,並將結果值 代替。

所以這意味着你應該設置必要的sql模式,當發生超出範圍錯誤時不會失敗。

這裏沒有配置參數。

和解決同樣的問題,我們可以看到here,說禁用STRICT_TRANS_TABLESSTRICT_ALL_TABLES模式可以解決您的問題。

2

定義

DECIMAL(9,2) 

裝置9位數字的精度,用2位數字小數點後。值

9999999999.99 

總共有12位精度,小數點後2位。因此,該值超出範圍。正確地說,在這兩種情況下,MySQL都應該拋出一個超出範圍的錯誤。在「工作」的情況下,我的猜測是發生了截斷。

順便說一下,您應該使用DECIMAL(12,2)或更寬來存儲您的問題中的值。

更新:爲什麼你的服務器中的一個在做插入,而另一個失敗的原因是,第一有傳統模式下關閉

一個可能的解釋。如果你看到的輸出看起來像

STRICT_TRANS_TABLES, STRICT_ALL_TABLES, ... 

那麼服務器在傳統的模式,這意味着它不會截斷,但會拒絕運行

SELECT @@SESSION.sql_mode 

:運行在兩臺服務器上以下。要關閉它,請嘗試運行

SET SESSION sql_mode='' 

並且它們的插入應該成功(截斷)。但無論如何,你應該而不是依靠生產中的截斷。如果您需要更高的精度,那麼擴大色譜柱。

參考:Automatically trimming length of string submitted to MySQL

+0

yes ..我知道,問題是爲什麼在un server上它工作,我想知道使autotruncation的配置值,我無法在mysql變量或文檔中找到它。 –