必须只导出ddl结构并显式设置utf8mb4字符集、禁用插入数据、校验sql模式与目标环境一致,避免脏数据和兼容性错误。
要给团队提供可直接执行、不含脏数据的初始化脚本,必须只导出结构(ddl),且确保字符集、外键、sql模式与目标环境一致——navicat 默认可能混入数据或用错编码,不能直接点“下一步”就完事。
导出前必须取消「插入记录」选项
很多人右键数据库选“转储SQL文件”后没注意第二步,默认勾选了“导出数据”,结果脚本里全是 INSERT 语句,团队一执行就把空库填满脏数据。这不是初始化,是污染。
- 正确路径:右键数据库 →「导出向导」→ 第二步(对象选择页)→ 点击「高级」→ 取消勾选
Insert records - 如果已导出含数据的脚本,别手动删
INSERT行——容易漏掉或删错约束语句;重导更安全 - Navicat 15+ 版本在「导出向导」第一步就有“仅结构”单选按钮,比老版本更直观
字符集和 SQL 模式必须显式设为 utf8mb4 + 兼容目标 MySQL 版本
脚本在本地 Navicat 里看着正常,一丢进 CI/CD 或测试环境就报 Unknown character set 'utf8mb3' 或 Invalid default value for 'created_at',根源是导出时沿用了源库的隐式设置,而非目标环境要求。
- 在导出向导「高级」页,
Character set必须手动选utf8mb4(不是utf8,也不是留空) - 勾选
Export with CREATE DATABASE,避免团队执行时因库不存在而中断 - MySQL 5.7 以下环境,取消勾选
Generate DROP statements,否则DROP DATABASE IF EXISTS会报语法错误
导出后务必检查三行“隐形头信息”
Navicat 导出的 SQL 脚本开头常带几行注释或 SET 语句,看似无害,但可能让脚本在某些 MySQL 客户端或自动化工具中静默失败。
- 打开导出的 .sql 文件,检查前三行是否含类似
/*!40101 SET NAMES utf8mb4 */;或/*!50503 SET TIME_ZONE='+00:00' */; - 这类条件注释(
/*!...*/)在低版本 MySQL 或非 MySQL 数据库中会被当普通注释跳过,但部分 CI 工具会严格解析并报错 - 若团队目标环境明确是 MySQL 8.0+ 且统一配置,可保留;否则建议手动删掉或替换为标准
SET NAMES utf8mb4;
最易被忽略的一点:导出脚本是否能被 Git 正确 diff。如果用了 REPLACE INTO 或自动生成的随机表顺序,每次导出都会让整个文件变更,失去版本追踪意义。初始化脚本应该稳定、可预测、无副作用——结构即契约,不是快照。











