發現 MySQL 建表時欄位名可包含斜線 /:
CREATE TABLE `op_day` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `date` DATE NOT NULL DEFAULT '0000-00-00' COMMENT '日期', `income` INT NOT NULL DEFAULT 0, `total` INT NOT NULL DEFAULT 0, `income/total` DOUBLE(11,2) NOT NULL DEFAULT '0.00', KEY `unique` (`date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
執行成功,欄位名為 income/total。
MySQL 識別符(識別名)若用**反引號 ` 包裹**,允許包含幾乎所有字元(含空格、符號、關鍵字、中文、Emoji)。斜線 / 在反引號內合法。
| 場景 | 寫法 | 風險 |
|---|---|---|
| 查詢 | SELECT `income/total` FROM `op_day`; | 必須永遠加反引號 |
| 別名 | SELECT `income/total` AS `ratio` ... | 建議查詢層即轉正常名 |
| 應用層 ORM | Entity 屬性名無法對應 | 需手工映射或視圖轉換 |
| 遷移/備份工具 | 部分工具不支援特殊字元 | 導出導入失敗 |
| SQL 注入防護 | 參數化查詢無影響 | 低 |
[a-z0-9_],不以數字開頭。income_total_ratio、income_div_total。-- 建立視圖提供正常欄位名 CREATE VIEW `v_op_day` AS SELECT `id`, `date`, `income`, `total`, `income/total` AS `income_total_ratio` FROM `op_day`; -- 或重命名欄位(MySQL 8.0+ 支援 RENAME COLUMN) ALTER TABLE `op_day` RENAME COLUMN `income/total` TO `income_total_ratio`;
MySQL 反引號機制雖強大,**但「能用不等於該用」**。欄位名包含斜線、空格、關鍵字等特殊字元,會給開發、維護、遷移、工具鏈帶來持續性痛苦。**嚴格遵循命名規範,視圖/重命名消除歷史包袱**,是專業 DBA 與開發者的共識。