遇到非法值不報錯,自動轉為「最可能的合法值」:
| 場景 | 自動轉換結果 |
|---|---|
| 數值超範圍 | 截斷為 0 或該型別最大值 |
| 字串過長 | 截斷存入 |
| 非數字字串存數值欄 | 存 0 |
| 非法日期(如 2000-02-31) | 原樣存入(若可讀回),完全非法存 0000-00-00 |
| 單行 INSERT 存 NULL 到 NOT NULL 欄 | 報錯 |
| 多行 INSERT/INSERT...SELECT 存 NULL 到 NOT NULL 欄 | 存隱式預設值(數值 0、字串 ''、日期零值) |
| INSERT 未指定欄值且無 DEFAULT | 存隱式預設值 |
設計初衷: 存儲引擎可能不支援回滾,語句執行到一半失敗若中止會留下「半更新」狀態,寧可「盡力而為」繼續執行。
| 模式 | 事務表行為 | 非事務表行為 |
|---|---|---|
STRICT_TRANS_TABLES | 任意位置出現非法值 → 全語句回滾 | 第 1 行出錯 → 回滾;後續行出錯 → 轉換並警告 |
STRICT_ALL_TABLES | 同左 | 任意行出錯 → 全語句回滾(可能造成部分更新) |
STRICT_TRANS_TABLES(兼顧事務表強一致、非事務表可用性)。STRICT_TRANS_TABLES 觀察警告日誌,清洗資料後再考慮 STRICT_ALL_TABLES。INSERT IGNORE INTO t (enum_col) VALUES ('illegal_val');
UPDATE IGNORE t SET set_col = 'a,b,illegal' WHERE id=1;
非法值轉警告,按寬容模式邏輯處理,語句不中斷。
MySQL 從「不報錯自動修」演進到「可選嚴格拒錯」,核心權衡在於**資料完整性**與**向後兼容/可用性**。現代應用建議:**應用層嚴格驗證 + 資料庫嚴格模式雙重保險**,徹底杜絕髒數據入庫。