1.8.2.4 '-'作为 Comments 的开始
标准 SQL 使用 C 语法/* this is a comment */
进行 Comments,而 MySQL Server 也支持该语法。 MySQL 还支持对此语法的扩展,该扩展使特定于 MySQL 的 SQL 可以嵌入到 Comments 中,如第 9.6 节“Comments 语法”中所述。
标准 SQL 使用“ --
”作为开始 Comments 序列。 MySQL Server 使用#
作为开始 Comments 字符。 MySQL Server 还支持--
Comments 样式的变体。也就是说,--
起始 Comments 序列后必须跟一个空格(或一个控制字符,例如换行符)。需要该空间以防止使用以下结构的自动生成的 SQL 查询出现问题,在该结构中我们自动插入payment
的付款值:
UPDATE account SET credit=credit-payment
考虑如果payment
的值为负值,例如-1
,会发生什么情况:
UPDATE account SET credit=credit--1
credit--1
是 SQL 中的有效 table 达式,但是--
被解释为 Comments 的开头,该 table 达式的一部分被丢弃。结果是一条语句,其含义与预期的完全不同:
UPDATE account SET credit=credit
该声明根本不会改变价值。这说明允许 Comments 以--
开头可能会造成严重后果。
使用我们的实现需要在--
之后有一个空格,以便在 MySQL Server 中将其识别为开始 Comments 序列。因此,credit--1
是安全使用的。
另一个安全功能是mysql命令行 Client 端忽略以--
开头的行。