預設情況下,MySQL按照以下規則處理“資料越界”和其他非正常資料
1、對於數值資料或time資料列,超出合法範圍的值將被階段到最近的取值範圍邊界;
2、對於字串資料列不包括enum、set)太長的字串將被截斷到資料列的最大長度,對於
ENUM類型資料,MySQL將不合法成員用Null 字元串代替。如果賦值給某個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將繼續執行該語句避免“部分更新問題”,對每個非法值將其轉換為最接近的合法值。
配合strict 模式的其他幾個SQL模式:
ERROR_FOR_DIVISION_BY_ZERO: 在strict 模式下,遇到以0為除數的情況,拒絕插入資料庫,如果不在strict 模式下,MYSQL將產生一條警示,並插入NULL值)
NO_ZERO_DATE:在strict 模式下,拒絕0日期值進入資料庫。
建議採用:strict_trans_tables ERROR_FOR_DIVISION_BY_ZERO
制止錯誤的另一個辦法是在insert或update語句裡使用IGNORE關鍵字,使非法值而導致的錯誤弱化為一個警告。
本文出自 “技術成就夢想” 部落格,請務必保留此出處http://weipengfei.blog.51cto.com/1511707/1173816