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)始终可以安全使用。