開發客戶管理系統,資料庫 `info` 含資料表 `document` (客戶資料)、`back` (回訪記錄)、`user` (員工編號)。所有程式碼邏輯正確,唯獨存取 `user` 資料表總報 ODBC 驅動程式錯誤。檢查拼寫、資料類型、SQL 語法均無誤,耗時兩天無果,差點懷疑人生。
`user` 是 **SQL Server 保留關鍵字** (系統函數 `USER_NAME()`、系統檢視 `sysusers` 等相關)。直接寫 `SELECT * FROM user` 會被剖析器誤判為函數/系統物件,導致語法錯誤或非預期行為。
SELECT * FROM [user] -- 方括號 (SQL Server 標準)
SELECT * FROM "user" -- 雙引號 (需 SET QUOTED_IDENTIFIER ON)
SELECT * FROM `user` -- 反引號 (MySQL 風格,SQL Server 不支援)
| 類別 | 範例 |
|---|---|
| 系統函數/變數 | USER, CURRENT_USER, SESSION_USER, SYSTEM_USER, @@IDENTITY, @@ROWCOUNT |
| 資料類型 | INT, VARCHAR, DATETIME, TEXT, IMAGE, MONEY, BIT |
| DDL 關鍵字 | CREATE, ALTER, DROP, TABLE, INDEX, VIEW, PROCEDURE, TRIGGER, DATABASE |
| DML 關鍵字 | SELECT, INSERT, UPDATE, DELETE, MERGE, JOIN, WHERE, GROUP, ORDER, HAVING |
| 其他高風險名稱 | ORDER, GROUP, KEY, INDEX, DESC, ASC, LEVEL, SIZE, TYPE, MODE, STATUS, ROLE, USER, PASSWORD, LOGIN |
一個保留字坑了兩天,換來一輩子的命名規範習慣。**永遠用分隔識別符號 `[ ]` 包裹識別名稱**,或干脆取個不衝突的好名字,讓編譯器、維護者、未來的自己都輕鬆。