天天看點

Mysql運作模式及1690錯誤處理1690 - BIGINT UNSIGNED value is out of range in

最近一段運作良好的代碼突然無法運作,報錯:

MySQL said: Documentation

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

當Mysql中的數字字段存儲了一個超過允許範圍的數字時,會觸發1690 Out of Range錯誤,是否觸發錯誤取決于SQL運作時的模式:

當标準 Standar Mode 或 Strict Mode 運作時,資料插入會失敗 當非限制模式 No Restrictive 運作時,Mysql将數值轉化為範圍允許内的最大或最小值進行存儲

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

自Mysql 5.5.5 之後,如果産生一個負數,則會産生一個錯誤 ERROR 1690。

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

參考資料