sql_mode 定義 MySQL 對 SQL 語法、資料驗證的嚴格程度。預設空值 (舊版) 寬鬆模式,資料截斷、非法日期僅警告不報錯。
-- 查看當前
SELECT @@sql_mode;
SHOW VARIABLES LIKE 'sql_mode';
-- 會話級生效
SET SESSION sql_mode = 'STRICT_TRANS_TABLES';
-- 全域生效 (需重新連線)
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES';
-- 永久生效:my.cnf [mysqld] sql_mode=...
CREATE TABLE tt3 (name CHAR(2));
SET SESSION sql_mode = 'STRICT_TRANS_TABLES';
INSERT INTO tt3 VALUES ('woshi'); -- ERROR 1406: Data too long for column 'name'
-- 關閉嚴格模式則只截斷存入 'wo' 並警告
SET SESSION sql_mode = 'NO_BACKSLASH_ESCAPES';
INSERT INTO tt3 VALUES ('\\1'); -- 實際存入雙字元 '\' 和 '1'
-- 關閉時反斜線視為跳脫,存入 '1'
SET SESSION sql_mode = 'PIPES_AS_CONCAT';
SELECT 'beijing' || 2008; -- 回傳 'beijing2008' (字串連接)
-- 關閉時 || 為邏輯 OR,回傳 1
| 模式 | 說明 |
|---|---|
ANSI | 盡量符合標準 SQL,啟用多項嚴格檢查。 |
STRICT_TRANS_TABLES | 事務表嚴格模式,資料截斷、非法日期直接報錯。 |
TRADITIONAL | STRICT_TRANS_TABLES + NO_ZERO_IN_DATE + NO_ZERO_DATE + ERROR_FOR_DIVISION_BY_ZERO,最嚴格,適合事務場景。 |
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION。NO_BACKSLASH_ESCAPES 除非極度確定應用層不依賴跳脫字元。