Contents

mysql查詢使用--註解踩到的雷

從 DB2 切換到 MySQL 時,常見的踩雷點之一就是 -- 註解的行為不同。這篇說明 MySQL 的三種註解方式與使用注意事項。

MySQL 的三種註解方式

1. # 單行註解

1
2
SELECT * FROM users; # 這是註解
# 這整行都是註解

# 是 MySQL 特有的語法,不屬於 SQL 標準,其他資料庫(如 DB2、PostgreSQL)不支援。

2. /* */ 多行區塊註解

1
2
3
/* 這是區塊註解
   可以跨多行 */
SELECT id, name /* 選擇欄位 */ FROM users;

這是標準 SQL 語法,所有主流資料庫都支援,也可以用在行中間。

3. -- 單行註解(需要後接空格)

1
2
-- 這是正確的 SQL 標準單行註解
SELECT * FROM users; -- 查詢所有使用者

⚠️ 重要:MySQL 要求 -- 後面至少要有一個空格(或 Tab、換行),否則不會被視為註解。

1
2
3
4
5
-- 正確:後面有空格
SELECT * FROM users; -- 正確

-- 錯誤:--後面沒有空格,不會被視為註解
SELECT * FROM users; --錯誤

為何 -- 需要空格?

根據 SQL 標準(SQL-99),-- 後面接空格才是合法的行內註解語法。MySQL 嚴格遵守這個規定,主要原因是避免與數字運算的負號混淆。例如:

1
2
SELECT 5--3;  -- 這是 5 減去 -3 = 8,不是 5 後接註解
SELECT 5-- 3; -- 這是 5,後接行內註解

DB2、Oracle 和 SQL Server 的實作通常更寬鬆,不強制要求空格,所以從這些資料庫切換到 MySQL 容易踩雷。


各種場景的使用建議

在 Stored Procedure 中

1
2
3
4
5
6
7
8
DELIMITER $$
CREATE PROCEDURE get_users()
BEGIN
    -- 查詢所有使用者(注意:-- 後需要空格)
    SELECT * FROM users;
    /* 也可以用區塊註解 */
END$$
DELIMITER ;

在一般查詢中臨時停用條件

1
2
3
4
5
SELECT *
FROM orders
WHERE status = 'active'
  /* AND created_at > '2024-01-01' */ -- 暫時停用日期篩選
  AND customer_id = 123;

跨資料庫移植建議

如果 SQL 需要跨不同資料庫(MySQL、DB2、PostgreSQL),建議統一使用 /* */-- (含空格)以確保相容性,避免使用 MySQL 特有的 # 語法。


三種註解方式比較

語法 類型 SQL 標準 跨資料庫相容 注意事項
# 單行 否(MySQL 特有) 簡單方便
/* */ 多行區塊 最通用
-- 單行 是(含空格) 後面必須有空格