天天看點

MySQL 處理非法資料

預設情況下,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,如需轉載請自行聯系原作者