MySQL 9.0 參考手冊  /  ...  /  '--' 作為註解的開頭

1.7.2.4 「--」作為註解的開頭

標準 SQL 使用 C 語法 /* 這是一個註解 */ 作為註解,MySQL 伺服器也支援此語法。MySQL 也支援此語法的擴充,使特定於 MySQL 的 SQL 可以嵌入到註解中;請參閱第 11.7 節,「註解」

MySQL 伺服器也使用 # 作為註解符號的開頭。這是不符合標準的。

標準 SQL 也使用 -- 作為註解序列的開頭。MySQL 伺服器支援 -- 註解樣式的變體;-- 註解序列的開頭會被接受,但必須後跟一個空格字元,例如空格或換行符號。加入空格的目的是為了防止在生成使用以下結構的 SQL 查詢時出現問題,該結構會更新餘額以反映費用

UPDATE account SET balance=balance-charge
WHERE account_id=user_id

請考慮當 charge 具有負值(例如 -1)時會發生什麼情況,當金額貸記到帳戶時可能會發生這種情況。在這種情況下,生成的陳述式如下所示

UPDATE account SET balance=balance--1
WHERE account_id=5752;

balance--1 是有效的標準 SQL,但 -- 被解釋為註解的開頭,並且一部分表達式被捨棄。結果是陳述式具有與預期完全不同的含義

UPDATE account SET balance=balance
WHERE account_id=5752;

此陳述式根本不會產生數值變更。為了防止這種情況發生,MySQL 要求在 -- 後面加上一個空格字元,以便在 MySQL 伺服器中將其識別為註解序列的開頭,這樣就可以安全地使用 balance--1 之類的表達式。