1. mysqldump 备份脚本(最常见场景)
mysqldump 导出的SQL文件大量使用条件注释,用来设置会话变量,保证导入时的字符集、时区、外键约束行为,同时兼容不同MySQL版本。
低版本MySQL不认识的语句,会自动当成注释跳过;其他数据库导入时也不会执行。
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;40101 代表 4.1.01,MySQL版本≥4.1.01才执行。
2. SQL脚本跨版本兼容
同一个SQL文件,一份脚本同时支持多个MySQL版本,新特性只在高版本执行,低版本自动跳过。
示例:MySQL8.0才支持的INSTANT ADD COLUMN,5.7不支持,用条件注释隔离:
-- MySQL >= 8.0.12 执行即时加列;5.7及更低版本忽略/*!80012 ALTER TABLE t_user ADD COLUMN create_time DATETIME NOT NULL INSTANT */;好处:一份升级脚本,不用维护多套SQL。
3. 跨数据库兼容(MySQL / 其他数据库)
/*! ... */对PostgreSQL、Oracle、SQLite来说,属于普通多行注释,里面SQL不会执行。
可以写一份SQL脚本,MySQL下执行专属语法,其他数据库自动忽略MySQL特有语句。
-- 只有MySQL会执行 ENGINE=InnoDB,其他数据库当成注释CREATETABLEtest(idINTPRIMARYKEY)/*! ENGINE=InnoDB */;4. 版本差异化DDL升级脚本
数据库迭代上线时,做表结构变更。
- 如果目标库版本高,执行新语法;
- 如果是老版本数据库,跳过这段DDL,使用兼容方案。
适合项目数据库环境版本参差不齐(一部分5.7,一部分8.0)的场景。
-- MySQL8.0才设置默认字符集为utf8mb4/*!80000 ALTER DATABASE db_test CHARACTER SET utf8mb4 */;5. 条件开启/关闭特有参数
部分系统变量只在特定MySQL版本存在,使用条件注释,避免低版本执行报错。
/*!80013 SET sql_require_primary_key = ON */;sql_require_primary_key是8.0.13才新增参数,5.7执行这条会报变量不存在,用条件注释规避报错。
6. 迁移脚本平滑降级兼容
做数据库迁移、回滚脚本时,可以在同一个文件写两套逻辑:高版本特性用条件注释包裹,一旦回滚到老版本,这部分语句自动失效,不会抛出语法错误。
⚠️ 使用限制&坑点(博客必加)
- 只识别MySQL版本号:条件判断仅基于MySQL版本,无法判断变量、操作系统、数据库配置;不能做业务逻辑判断。
- 版本号规则:版本编码公式
主版本*10000 + 次版本*100 + 修订号- 8.0.24 → 80024
- 5.7.36 → 50736
- 不要写业务DML:尽量只放DDL、会话SET语句;不要包裹UPDATE/DELETE业务数据语句,版本差异容易引发意外数据变更。
- 不要滥用:大量条件注释会降低SQL可读性,能拆分脚本就不要强行全部写在一个文件。
总结一句话
条件注释本质就是让同一份SQL脚本,根据MySQL版本选择性执行部分语句,实现跨版本、跨库兼容,最典型的使用案例就是mysqldump。