啟用方式
- 啟動參數(所有版本):
mysqld --ansi
等價於:
--transaction-isolation=SERIALIZABLE --sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE
- 運行時動態設置(MySQL 4.1+):
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET GLOBAL sql_mode = 'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE';
- 一鍵設置 ANSI 模式(MySQL 4.1.1+):
SET GLOBAL sql_mode = 'ANSI';
驗證:SELECT @@global.sql_mode; → 顯示包含 ANSI 及上述所有子模式。
ANSI 模式包含的關鍵行為變更
| 模式標誌 | 行為改變 |
REAL_AS_FLOAT | REAL 類型視為 FLOAT 而非 DOUBLE |
PIPES_AS_CONCAT | || 視為字串連接運算子而非邏輯 OR |
ANSI_QUOTES | " 視為識別符引用(如表名),字串必須用 ' |
IGNORE_SPACE | 函數名與括號間允許空格:COUNT (*) 合法 |
SERIALIZABLE | 事務隔離級別提升至最高,防止幻讀 |
應用場景與注意事項
- 遷移應用: 從標準 SQL 資料庫(PostgreSQL、Oracle、SQL Server)遷移時,開啟 ANSI 模式可減少語法改寫工作量。
- 相容性測試: 現有應用開啟前務必全量回歸測試,特別是雙引號字串、
|| 運算子、函數呼叫空格等隱性差異。
- 會話級別覆蓋:
SET SESSION sql_mode = 'ANSI'; 僅影響當前連線,適合灰度測試。
查看當前 sql_mode
SELECT @@sql_mode; -- 會話級
SELECT @@global.sql_mode; -- 全域級