預設情況下,MySQL按照以下規則處理“資料越界”和其他非正常資料
1、對於數值資料或time資料列,超出合法範圍的值將被階段到最近的取值範圍邊界;
2、對於字串資料列(不包括enum、set)太長的字串將被截斷到資料列的最大長度,對於
ENUM型別資料,MySQL將不合法成員用空字串代替。如果賦值給某個set資料列包含非法子字串,那mysql會刪除那些子字串並把剩下的賦值給該資料列
3、對於日期和時間資料列,非法數值會被轉換成‘0’值替代
當發生上述情況的時候,MySQL會生成警告, 可使用 show warnings 檢視。
4、對於字串序列,太長的字串將被截短到資料列的最大長度
如果需要在插入或更新資料時進行更嚴格的檢查,可以啟用特殊的SQL MODE;
sql_mode=`strict_all_tables,strict_trans_tables`
對於支援事務的表,這兩種模式是一樣的:如果發現某個值缺失或非法,MySQL將丟擲錯誤,語句會停止執行並回滾。
對於不支援事務的表,這兩種模式的效果:
1、如果在插入或修第一個資料行時就發現某個值非法或缺失,那該語句直接拋錯,語句停止執行。這個和支援事務的資料錶行為時一樣的。
2、如果在插入或修改第n個(n>1)資料行時才發現錯誤,那就會出現下面的情況:
2.1 在strict_all_tables模式下,停止語句執行,存在部分更新的問題
2.2 在strict_trans_tables模式下,MySQL將繼續執行該語句避免“部分更新問題”,對每個非法值將其轉換為最接近的合法值。
配合嚴格模式的其他幾個SQL模式:
ERROR_FOR_DIVISION_BY_ZERO: 在嚴格模式下,遇到以0為除數的情況,拒絕插入資料庫,(如果不在嚴格模式下,MYSQL將生成一條告警,並插入NULL值)
NO_ZERO_DATE:在嚴格模式下,拒絕0日期值進入資料庫。
建議採用:strict_trans_tables ERROR_FOR_DIVISION_BY_ZERO
制止錯誤的另一個辦法是在insert或update語句裡使用IGNORE關鍵字,使非法值而導致的錯誤弱化為一個警告。