mysql 處理非法資料 MySQL 處理非法資料

2021-10-17 22:57:13 字數 1065 閱讀 4834

預設情況下,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關鍵字,使非法值而導致的錯誤弱化為乙個警告。

演算法 資料預處理

1.缺失值 許多元組的屬性沒記錄值 可能缺失,可能故意留白後期填寫。1 忽略元組 適用於元組有多個缺少值,每個屬性缺失值的百分比變化大時效能就會很差,採用忽略元組,就不能使用該元組的剩餘屬性值。2 人工填寫缺失值 費時費力,不適合大的資料集。3 使用乙個全域性常量填充預設值 將缺失值用同乙個常量 u...

MySQL 基礎語法 資料型別

ddl 語句 資料定義語句,定義不同資料庫 資料表 列 索引等資料庫物件,常用關鍵字有create drop alter等 dml 語句 資料操作語句,用於新增 刪除 修改和查詢資料庫記錄,並檢查資料的完整性。常用關鍵字有 insert delete update select等 dcl 語句 資料...

Mysql 語法 資料型別 文字常量

數字型別 對於整數允許進行顯示寬度的設定,這個設定並不影響其值的實際範圍 對於bit數 浮點 定點小數,m是指其有效數字位數,影響值的範圍。日期時間型別 文字型別 通常文字型別有以下通用特性 文字型別的長度是字元長度,不是位元組長度 文字型別具有 character set charset 字符集屬...