2000-02-31)→ 存入;完全非法 → 存 0000-00-00NULL 存入 NOT NULL 欄位:單行報錯,多行/子查詢 → 存隱含預設值(0/空字串/零日期)DEFAULT → 存隱含預設值設計哲學: 執行中才發現問題,回滾成本高(引擎可能不支援),寧可「做到最好」繼續執行。
| 模式 | 事務引擎 (InnoDB) | 非事務引擎 (MyISAM) |
|---|---|---|
STRICT_TRANS_TABLES | 任何位置出現非法值 → **全語句回滾** | 第 1 行出錯 → 放棄語句;第 1 行後出錯 → 調整值並警告 |
STRICT_ALL_TABLES | 同左 | **任何行出錯 → 全語句放棄**(部分行已寫入) |
-- my.cnf 永久生效
[mysqld]
sql_mode = STRICT_TRANS_TABLES,STRICT_ALL_TABLES,...
-- 會話層級臨時生效
SET SESSION sql_mode = 'STRICT_TRANS_TABLES';
SHOW WARNINGS 找出問題 SQLINSERT IGNORE / UPDATE IGNORE 將錯誤降級為警告STRICT_TRANS_TABLES(InnoDB 為主),兼顧資料品質與可用性-- 傳統嚴格模式
STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
-- 完整嚴格(含除零錯誤、日期檢查等)
STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
結語: 嚴格模式是資料品質的守門員,配合應用端驗證,才能從源頭杜絕髒資料。