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