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

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 這樣的表達式始終可以安全使用。