今天除錯程式,系統丟擲這個異常:out of range value adjusted for column 'bodyweight'。
進資料庫看見這個欄位的型別是decimal[4,2]。錄入三位數就出異常。
decimal[(m[,d])] [zerofill]
乙個未壓縮(unpack)的浮點數字。不能無符號。行為如同乙個char
列:「未壓縮」意味著數字作為乙個字串被儲存,值的每一位使用乙個字元。小數點,並且對於負數,
「-」符號不在m中計算。如果d
是0,值將沒有小數點或小數部分。decimal
值的最大範圍與double
相同,但是對乙個給定的decimal
列,實際的範圍可以通過m
和d
的選擇被限制。如果d
被省略,它被設定為0。如果m
被省掉,它被設定為10。注意,在mysql3.22裡,m
引數包括符號和小數點。
只要把m改大一點就不出錯了,我也到網上搜了一下,說這是mysql嚴格檢查的結果。mysql下my.ini檔案的 strict_trans_tables關掉就好了:
#set the sql mode to strict
#sql-mode="strict_trans_tables,no_auto_create_user,no_engine_substitution"
sql-mode="no_auto_create_user,no_engine_substitution"
又上網搜了一下strict_trans_tables這是什麼?
strict_trans_tables的工作方式:
· 對於事務性儲存引擎,在語句中任何地方出現的不良資料值均會導致放棄語句並執行回滾。
· 對於非事務性儲存引擎,如果錯誤出現在要插入或更新的第1行,將放棄語句。(在這種情況下,可以認為語句未改變表,就像事務表一樣)。首行後出現的錯誤不 會導致放棄語句。
取而代之的是,將調整不良資料值,並給出告警,而不是錯誤。換句話講,使用strict_trans_tables後,錯誤值會導致 mysql執行回滾操作,如果可以,所有更新到此為止。
要想執行更嚴格的檢查,請啟用strict_all_tables。除了非事務性儲存引擎,它與strict_trans_tables等同, 即使當不良資料出現在首行後的其他行,所產生的錯誤也會導致放棄語句。這意味著,如果錯誤出現在非事務性表多行插入或更新過程的中途,僅更新部分結果。前 面的行將完成插入或更新,但錯誤出現點後面的行則不然。
float,double和decimal型別區別
float 浮點型,含位元組數為4,32bit,數值範圍為 3.4e38 3.4e38 7個有效位 double 雙精度實型,含位元組數為8,64bit數值範圍 1.7e308 1.7e308 15個有效位 decimal 數字型,128bit,不存在精度損失,常用於銀行帳目計算。28個有效位 fl...
MySQL資料型別中DECIMAL的作用和用法
在mysql資料型別中,例如int,float,double,char,decimal等,它們都有各自的作用,下面我們就主要來介紹一下mysql資料型別中的decimal型別的作用和用法。一般賦予浮點列的值被四捨五入到這個列所指定的十進位制數。如果在乙個float 8,1 的列中儲存1.2 3 4 ...
MySQL資料型別中DECIMAL的作用和用法
在mysql資料型別中,例如int,float,double,char,decimal等,它們都有各自的作用,下面我們就主要來介紹一下mysql資料型別中的decimal型別的作用和用法。一般賦予浮點列的值被四捨五入到這個列所指定的十進位制數。如果在乙個float 8,1 的列中儲存1.2 3 4 ...