普通注释:MySQL完全忽略,不会执行
条件注释:特定版本/环境下会被解析执行,其他情况当作注释忽略
1. 普通注释(纯注释,永远不执行)
两种写法:
sql
-- 单行注释(--后面要有空格)
# 单行注释
/* 多行注释
这里面所有SQL都会被MySQL直接忽略,无论版本
*/
✅ 特点:
- 所有MySQL版本行为一致
- 仅用于写说明文档,不会执行里面任何SQL
- 导出、导入SQL脚本,注释内容保留,但不会生效
2. 条件注释(MySQL专属,有条件执行)
语法:/*! 版本号 SQL语句 */
sql
-- 大于等于5.7.20版本才执行,低版本直接当成注释
/*!50720 CREATE INDEX idx_name ON t(name); */
/*!开启条件注释50720= 5.7.20(主版本10000 + 次版本100 + 修订号)*/结束标记
还有反向写法(/*!80000+ 语句 */,8.0以上执行);
还有跨库兼容写法:/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;,mysqldump导出脚本大量使用。
✅ 特点:
- 条件生效:满足版本条件 → 内部SQL执行;不满足 → 当成普通注释跳过
- 其他数据库(Oracle、PostgreSQL)看到
/*!xxx ... */直接识别为普通注释,不会执行,用来做跨库兼容 - mysqldump 大量使用这个特性
3. 核心区别汇总表
| 对比项 | 普通注释 | MySQL条件注释 |
|---|---|---|
| 语法 | -- # /* */ |
/*!版本号 sql */ |
| 是否执行 | 永远不执行 | 版本匹配 → 执行;不匹配 → 不执行 |
| 用途 | 代码备注、临时屏蔽SQL | 跨版本兼容、mysqldump脚本、跨数据库兼容 |
| 其他数据库 | 全部识别为注释 | 其他数据库识别为普通注释,不会执行里面SQL |
| 风险 | 无风险 | 有风险,版本匹配时SQL会运行,容易踩坑 |
4. 实战例子对比
sql
-- 普通注释,下面这条建索引永远不会执行
/* CREATE INDEX idx_test ON user(name); */
-- 条件注释:MySQL >=8.0.12 就会执行建索引,低于该版本忽略
/*!80012 CREATE INDEX idx_test ON user(name); */
5. 博客补充小坑
很多人踩坑:直接复制mysqldump导出SQL,以为/*!xxx */是注释直接删掉,或者误以为里面代码永远不跑;
条件注释不是单纯备注,是可执行的SQL!