| 場景 | 錯誤寫法 | 正確寫法 |
| 列名為保留字 | SELECT order FROM t; | SELECT `order` FROM t; |
| 表名含空格 | CREATE TABLE my table (id INT); | CREATE TABLE `my table` (id INT); |
| 列名含中文 | ALTER TABLE t ADD 姓名 VARCHAR(20); | ALTER TABLE t ADD `姓名` VARCHAR(20); |
| 別名為關鍵字 | SELECT id AS select FROM t; | SELECT id AS `select` FROM t; |
三、無需使用反引號的場景
- 標準識別符:以字母/下劃線開頭,僅含字母、數字、下劃線、$、且非保留字
- 例如:
user_id、order_count、t1、db_name
四、跨資料庫識別符轉義對比
| 資料庫 | 轉義符號 | 標準符合性 |
| MySQL | ` (反引號) | 非標準 (兼容 ANSI_QUOTES 模式下雙引號) |
| PostgreSQL | " (雙引號) | SQL 標準 |
| Oracle | " (雙引號) | SQL 標準 |
| SQL Server | [] (方括號) 或 " | 方括號為專有,雙引號需設 QUOTED_IDENTIFIER ON |
| SQLite | "、`、[] | 兼容多種 |
五、ANSI_QUOTES 模式
SET SESSION sql_mode = 'ANSI_QUOTES';
-- 或 my.cnf: sql_mode=ANSI_QUOTES
-- 啟用後:雙引號 " 識別符,單引號 ' 字符串
SELECT "column" FROM "table"; -- 標準寫法
-- 反引號 ` 仍可用
六、最佳實踐建議
- 命名規範優於轉義:避免保留字、空格、中文命名,自然無需反引號
- ORM/查詢構建器自動處理:Laravel Eloquent、MyBatis、Hibernate 等框架自動加反引號
- 手寫 SQL 統一加反引號:防御性編程,防止未來版本新增保留字導致語法錯誤
- 避免雙引號作字符串:MySQL 預設雙引號等同單引號,易混淆,字符串堅持用單引號
七、常見誤區
- 以為反引號是單引號 → 字符串用反引號報錯
Unknown column
- 複製代碼時反引號變成單引號/全形字符 → 語法錯誤
- 以為所有資料庫都支援反引號 → 移植 SQL 時需轉換
反引號是 MySQL 識別符轉義的「保護傘」。遵循命名規範、善用框架自動轉義、手寫 SQL 防御性加反引號,能避免 90% 的識別符相關語法錯誤。
- 上一篇文章: MySQL 單條語句批量插入多條數據:原理、寫法與效能實測
- 下一篇文章: Mac 環境下 MySQL 中文亂碼完整解決方案
Copyright ©
程式碼之家 All Rights Reserved