Mysql執行模式及1690錯誤處理

2021-09-22 18:59:39 字數 1322 閱讀 3917

最近一段執行良好的**突然無法執行,報錯:

mysql said: documentation

經過查詢,發現這個錯誤的原因是兩個時間字段進行減法運算時,如果有乙個時間為0000-00-00時造成的,根本原因是因為這樣減法的結果會超過mysql數值字段的範圍,從而觸發1690報錯。

當mysql中的數字字段儲存了乙個超過允許範圍的數字時,會觸發1690 out of range錯誤,是否觸發錯誤取決於sql執行時的模式:

當標準 standar mode 或 strict mode 執行時,資料插入會失敗

當非限制模式 no restrictive 執行時,mysql將數值轉化為範圍允許內的最大或最小值進行儲存

set sql_mode = 'no_unsigned_subtraction';

在進行計算時,首先執行上面的語句,可以避免減法運算過程中的錯誤。在mysql文件中,明確指出兩個整數進行相減運算的結果是乙個無符號數,在mysql 5.5.5 之前,如果產生乙個負數,mysql會將這個數轉換為乙個最大的數值。

mysql> set sql_mode = '';

mysql> select cast(0 as unsigned) - 1;

+-------------------------+

| cast(0 as unsigned) - 1 |

+-------------------------+

| 18446744073709551615 |

+-------------------------+

自mysql 5.5.5 之後,如果產生乙個負數,則會產生乙個錯誤 error 1690。

mysql> set sql_mode = '';

query ok, 0 rows affected (0.00 sec)

mysql> select cast(0 as unsigned) - 1;

error 1690 (22003): bigint unsigned value is out of range in '(cast(0 as unsigned) - 1)'

sql_mode預設為空,有很多的選項,建議在生產環境中設定成嚴格的mode,這樣可以在運維期間避免很多麻煩。

參考資料

1、server sql modes

2、out of range and overflow handling

3、mysql sql_mode

Python 安裝Mysql模組及安裝中錯誤的解決

我的開發環境是中文win7系統32位,python 2.7,mysql 14.4。linux在虛擬機器裡呢,熟練之前先不挑戰開發環境了 注意 這裡是安裝python的mysql模組,而不是mysql,到了這一步它應該是已經安裝好了的 包括mysql server和mysql python conne...

mysql建立批量更新儲存過程和執行存錯過程

一 建立批量更新儲存過程 create procedure update edge charge status begin 更新門禁收費狀態.1.建立臨時表 create temporary table unit tmp as select unit.id,unit.status from unit...

mysql 檢視執行級別 執行級別及程序

etc rc.d rc.sysinit 由init程序呼叫執行 完成設定網路 主機名 載入檔案系統等初始化工作 etc rc.d rc指令碼檔案 由init程序呼叫執行 根據指定的執行級別,載入或終止相應的系統服務 etc rc.local指令碼檔案 由rc指令碼呼叫執行 儲存使用者定義的需開機後自...