1.7.2.4 '--' 作为注释的开头

标准SQL使用C语法/* 这是注释 */,MySQL Server也支持这个语法。 MySQL还支持扩展该语法,以嵌入MySQL特定的SQL到注释中;见第11.7节,“注释”

MySQL Server也使用#作为注释的开始字符。这是非标准的。

标准SQL还使用--作为注释的开始序列。MySQL Server支持--注释风格的变体;--开始注释序列被接受,但必须以空白字符结尾,如空格或换行。空格旨在防止使用生成的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 Server才能识别为注释序列,因此表达式balance--1总是安全使用。