默認情況下,MySQL按照以下規(guī)則處理“數(shù)據(jù)越界”和其他非正常數(shù)據(jù)
1攻臀、對于數(shù)值數(shù)據(jù)或time數(shù)據(jù)列轰传,超出合法范圍的值將被階段到最近的取值范圍邊界幔嫂;
2辆它、對于字符串數(shù)據(jù)列(不包括enum、set)太長的字符串將被截斷到數(shù)據(jù)列的最大長度履恩,對于
?? ENUM類型數(shù)據(jù)锰茉,MySQL將不合法成員用空字符串代替。如果賦值給某個set數(shù)據(jù)列包含非法子字符串切心,那mysql會刪除那些子字符串并把剩下的賦值給該數(shù)據(jù)列
3飒筑、對于日期和時間數(shù)據(jù)列,非法數(shù)值會被轉換成‘0’值替代
當發(fā)生上述情況的時候绽昏,MySQL會生成警告协屡, 可使用 show warnings 查看。
4全谤、對于字符串序列肤晓,太長的字符串將被截短到數(shù)據(jù)列的最大長度
如果需要在插入或更新數(shù)據(jù)時進行更嚴格的檢查,可以啟用特殊的SQL MODE;
sql_mode='strict_all_tables,strict_trans_tables'
對于支持事務的表认然,這兩種模式是一樣的:如果發(fā)現(xiàn)某個值缺失或非法补憾,MySQL將拋出錯誤,語句會停止運行并回滾季眷。
對于不支持事務的表余蟹,這兩種模式的效果:
1卷胯、如果在插入或修第一個數(shù)據(jù)行時就發(fā)現(xiàn)某個值非法或缺失子刮,那該語句直接拋錯,語句停止執(zhí)行窑睁。這個和支持事務的數(shù)據(jù)表行為時一樣的挺峡。
2、如果在插入或修改第n個(n>1)數(shù)據(jù)行時才發(fā)現(xiàn)錯誤担钮,那就會出現(xiàn)下面的情況:
?? 2.1 在strict_all_tables模式下橱赠,停止語句執(zhí)行,存在部分更新的問題
?? 2.2 在strict_trans_tables模式下箫津,MySQL將繼續(xù)執(zhí)行該語句避免“部分更新問題”狭姨,對每個非法值將其轉換為最接近的合法值宰啦。
配合嚴格模式的其他幾個SQL模式:
ERROR_FOR_DIVISION_BY_ZERO: 在嚴格模式下,遇到以0為除數(shù)的情況饼拍,拒絕插入數(shù)據(jù)庫赡模,(如果不在嚴格模式下,MYSQL將生成一條告警师抄,并插入NULL值)
NO_ZERO_DATE:在嚴格模式下漓柑,拒絕0日期值進入數(shù)據(jù)庫。
建議采用:strict_trans_tables ERROR_FOR_DIVISION_BY_ZERO
制止錯誤的另一個辦法是在insert或update語句里使用IGNORE關鍵字叨吮,使非法值而導致的錯誤弱化為一個警告辆布。