sql多行注释必须用/ /成对出现且不可嵌套,漏写/会导致后续语句被误注释;注释内不能含/(即使引号包裹),需注意数据库兼容性差异及空格要求。
sql多行注释 /* */ 怎么写才不报错
多行注释必须成对出现,且不能嵌套。常见错误是漏掉结尾的 */,导致后续所有 sql 被当成注释,执行时直接报语法错误或返回空结果。
使用场景:临时屏蔽大段查询、在复杂 CREATE VIEW 或存储过程中加说明、调试时注释掉中间逻辑。
-
/*和*/必须在同一语句内(哪怕跨行),但不能跨多个独立语句——比如在 MySQL 客户端中用分号分隔的两条语句,第二条不会“继承”第一条的注释状态 - 注释内容里不能出现
*/,哪怕它被引号包裹也不行(例如'abc */ def'会提前结束注释) - PostgreSQL 和 SQL Server 支持
/* */,但 SQLite 默认不支持(需编译时开启ENABLE_COMMENT)
示例(安全):
SELECT name, age FROM users /* 这里是多行注释 可以换行,但不能有 */ WHERE active = 1;
-- 单行注释为什么有时“失效”
-- 后面必须紧跟一个空格或制表符(部分数据库如 MySQL 8.0+ 允许紧贴,但 PostgreSQL、SQL Server 严格要求空格),否则会被当作操作符或标识符的一部分,引发解析错误。
常见错误现象:--WHERE id=1 不生效,查询仍带条件;或者报错 ERROR: syntax error at or near "--"。
-
--只注释到本行末尾,换行后自动结束,不延续 - 某些客户端(如 DBeaver 的 SQL 编辑器)支持用
--注释多行,但这是编辑器行为,不是 SQL 标准——实际发给数据库的仍是多条独立语句,每行都得带-- - Oracle 中
--和/* */都支持;MySQL 5.7+ 对--的空格要求已放宽,但为兼容旧版本,仍建议统一加空格
示例(推荐写法):
SELECT * FROM orders; -- 这行被忽略 SELECT COUNT(*) FROM orders; -- 这个注释也只到分号前
混合使用 /* */ 和 -- 时的坑
二者可以共存,但顺序和位置容易引发歧义。最典型的是在 /* */ 内部写 --,它不会起作用——因为整个区域已被识别为块注释,-- 就只是普通字符。
反过来,在 -- 行里写 /* 也不会开启多行注释,因为单行注释优先级更高。
- 不要试图用
--去“关闭”一个/*,这会导致语法错误(/* ... -- */中的--无效,*/才是唯一出口) - 嵌套注释(
/* /* inner */ outer */)在所有主流数据库中都不合法,会报错或截断 - 如果用程序拼接 SQL(比如 Python 的
f-string),注意字符串里混入/*或--可能意外触发注释,建议先转义或改用参数化查询
不同数据库对注释的兼容性差异
标准 SQL-92 规定只支持 --,/* */ 是后来扩展的,所以老系统或轻量数据库可能只认其一。
- MySQL:两者都支持,
--要求空格,/* */可用于提示(如/*+ USE_INDEX(users) */) - PostgreSQL:严格遵循空格规则,
--后无空格会报错;/* */支持跨函数体,但在DO $$ ... $$块内需注意引号匹配 - SQL Server:支持两者,但 Management Studio 的“注释/取消注释”快捷键默认只处理
--,容易让人误以为/* */不被支持 - SQLite:默认仅支持
--;启用ENABLE_COMMENT后才支持/* */,但多数嵌入式部署没开
真正麻烦的不是语法本身,而是你写的注释在另一个环境里被当成了代码——比如本地用 PostgreSQL 测试正常,上线到 MySQL 时发现某处少了个空格,整条语句就静默失效了。











