首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL sql_mode 詳細解析:嚴格模式、NO_BACKSLASH_ESCAPES、PIPES_AS_CONCAT 實測

     編輯:MySQL 綜合教學

什麼是 sql_mode

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=...

常用模式實測

1. STRICT_TRANS_TABLES (嚴格模式)

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' 並警告

2. NO_BACKSLASH_ESCAPES

SET SESSION sql_mode = 'NO_BACKSLASH_ESCAPES';
INSERT INTO tt3 VALUES ('\\1'); -- 實際存入雙字元 '\' 和 '1'
-- 關閉時反斜線視為跳脫,存入 '1'

3. PIPES_AS_CONCAT

SET SESSION sql_mode = 'PIPES_AS_CONCAT';
SELECT 'beijing' || 2008; -- 回傳 'beijing2008' (字串連接)
-- 關閉時 || 為邏輯 OR,回傳 1

常見組合模式

模式說明
ANSI盡量符合標準 SQL,啟用多項嚴格檢查。
STRICT_TRANS_TABLES事務表嚴格模式,資料截斷、非法日期直接報錯。
TRADITIONALSTRICT_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 除非極度確定應用層不依賴跳脫字元。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved