預設情況下,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關鍵字,使非法值而導緻的錯誤弱化為一個警告。
本文轉自 位鵬飛 51CTO部落格,原文連結:http://blog.51cto.com/weipengfei/1173816,如需轉載請自行聯系原作者