首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 竟然允許斜線 / 作為欄位名稱?實測與避坑指南

     編輯:MySQL 資料庫相關知識

現象

發現 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` ...建議查詢層即轉正常名
應用層 ORMEntity 屬性名無法對應需手工映射或視圖轉換
遷移/備份工具部分工具不支援特殊字元導出導入失敗
SQL 注入防護參數化查詢無影響低

最佳實踐:堅決不用特殊字元

  1. 命名規範:小寫字母、數字、下劃線 [a-z0-9_],不以數字開頭。
  2. 語意清晰:income_total_ratio、income_div_total。
  3. 已有特殊字元欄位如何處理:
-- 建立視圖提供正常欄位名
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 與開發者的共識。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved