在 MySQL 5.0.2 版本之前,資料庫對非法或不當數值的處理相當寬鬆,甚至會強制將其轉換為合法值以便數據輸入。自 MySQL 5.0.2 起,雖然保留了原有的預設行為,但引入了更傳統、嚴格的 SQL 模式,讓伺服器能夠拒絕並終止包含不良值的語句執行。
若未啟用嚴格模式,MySQL 會採取「盡最大可能修正」的策略:
這種設計源於早期存儲引擎不支援回滾,若執行到一半發現錯誤無法回滾,會導致「半數據更新」的最壞情況,因此選擇「盡力做到最好」然後繼續執行。
MySQL 5.0.2+ 提供兩種嚴格模式:
對所有引擎一視同仁:任何行出錯都導致語句放棄。非事務表可能出現「前面幾行已寫入、後面失敗」的部分更新狀態。建議搭配單行語句或使用 INSERT IGNORE/UPDATE IGNORE 將錯誤降級為警告。
最安全、通常也最快的方式是讓應用層負責數據驗證,僅向資料庫傳遞合法值。嚴格模式作為第二道防線,配合 IGNORE 關鍵字可靈活控制錯誤處理行為。