MySQL 允許使用反引號 (backtick, `) 包裹標識符 (資料庫名、表名、欄位名、別名),解決與保留字衝突、包含特殊字元、大小寫敏感等問題。本文系統說明用法、常見場景、遷移注意事項。
-- 錯誤:from 是保留字
SELECT from FROM table; -- ERROR 1064
-- 正確:反引號包裹
SELECT `from` FROM `table`;
| 對象 | 範例 | 說明 |
|---|---|---|
| 資料庫名 | CREATE DATABASE \`order\`; | ORDER 為保留字 |
| 表名 | SELECT * FROM \`group\`; | GROUP 為保留字 |
| 欄位名 | SELECT \`select\`, \`where\` FROM t; | 查詢關鍵字作欄位名 |
| 別名 | SELECT id AS \`order\` FROM t; | 結果集別名含保留字 |
| 索引名 | CREATE INDEX \`key\` ON t(col); | |
| 視圖名 | CREATE VIEW \`select\` AS ... |
SELECT, INSERT, UPDATE, DELETE, WHERE, FROM, GROUP, ORDER, BY,
HAVING, LIMIT, JOIN, LEFT, RIGHT, INNER, OUTER, ON, AS,
INDEX, KEY, PRIMARY, UNIQUE, FOREIGN, REFERENCES, CHECK,
TABLE, DATABASE, VIEW, TRIGGER, PROCEDURE, FUNCTION,
DESC, ASC, DISTINCT, EXISTS, IN, LIKE, BETWEEN, IS, NULL,
AND, OR, NOT, XOR, TRUE, FALSE, DEFAULT, VALUES, SET,
CURRENT_TIMESTAMP, NOW, DATE, TIME, TIMESTAMP, DATETIME,
INT, BIGINT, VARCHAR, CHAR, TEXT, BLOB, JSON, ENUM, SET
完整列表請參考官方文檔:https://dev.mysql.com/doc/refman/8.0/en/keywords.html
| 符號 | 名稱 | 用途 | 範例 |
|---|---|---|---|
` | 反引號 / Backtick | 標識符包裹 (識別符) | SELECT \`name\` FROM \`user\`; |
' | 單引號 | 字串字面值 | WHERE name = 'John' |
" | 雙引號 | 字串字面值 (ANSI_QUOTES 模式下為標識符) | WHERE name = "John" |
關鍵差異: 單/雙引號包裹的是「值」,反引號包裹的是「名稱」。
-- 啟用後,雙引號變為標識符包裹,字串必須用單引號
SET SESSION sql_mode = 'ANSI_QUOTES';
SELECT "name" FROM "user"; -- 正確:雙引號作標識符
SELECT 'name' FROM 'user'; -- 錯誤:單引號字串不可作表名
-- 字串必須用單引號
WHERE name = 'John';
建議不啟用 ANSI_QUOTES,統一使用反引號包裹標識符,單引號包裹字串,避免混淆。
--quote-names (預設開啟) 自動包裹[column] 或雙引號 (QUOTED_IDENTIFIER ON)"column" (區分大小寫)"COLUMN" (區分大小寫)user_from, order_date 等描述性命名SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME IN (保留字列表)