用“运行 SQL 文件”复制表结构最稳:右键→「转储 SQL 文件」→勾选Structure only,检查ENGINE和CHARSET,手动执行;数据传输功能更灵活,可跨服务器并控制清空、自增等;连接层需设SET NAMES utf8mb4防乱码;完整复制需用「对象信息」→「DDL」页签手动拼接。
复制表结构但不复制数据:用“运行 SQL 文件”最稳
navicat 里点右键 →「转储 sql 文件」再导入,看似快,实则容易漏掉字符集、存储引擎、注释甚至外键约束。真正可控的方式是导出结构(structure only),然后手动执行建表语句。
- 右键目标表 →「转储 SQL 文件」→ 勾选
Structure only,取消勾选Data - 导出后打开 SQL 文件,检查
CREATE TABLE语句是否含ENGINE=InnoDB DEFAULT CHARSET=utf8mb4等关键项;若缺失,说明源库连接没设对字符集 - 新建查询窗口,粘贴并执行该语句;别直接双击 SQL 文件导入——Navicat 默认会跳过错误继续执行,
ERROR 1050 (42S01): Table 'xxx' already exists这类错误会被吞掉
复制表+数据:用“数据传输”功能比“备份/还原”更灵活
“备份/还原”走的是物理文件路径,依赖服务端权限和临时目录,新手常卡在 Access denied for user 'xxx'@'localhost' (using password: YES) 或找不到 .sql 存放位置。“数据传输”走的是连接通道,全程在 Navicat 客户端控制。
- 顶部菜单 →「工具」→「数据传输」→ 左侧选源库表,右侧选目标库(可跨连接、跨服务器)
- 点击「高级」→ 勾选
Truncate target table before transfer(清空再插),否则重复执行会报Duplicate entry - 注意
Auto-increment value默认不传输,如果目标表主键是自增,要手动在「高级」里勾选它,否则新数据 ID 从 1 开始冲突
复制时字段乱码或中文变问号:不是 Navicat 错,是连接层编码没对齐
即使表结构里写了 CHARSET=utf8mb4,Navicat 连接参数没配对,SELECT 出来就是 ?,INSERT 进去也是 ?,复制动作越快,污染越彻底。
- 右键连接 →「编辑连接」→「高级」页签 → 找到
Initial statement,填入:SET NAMES utf8mb4; - 确认服务器 my.cnf 里有
collation-server = utf8mb4_unicode_ci和init_connect='SET NAMES utf8mb4'(后者对普通用户生效) - 测试方法:新建查询,执行
SHOW VARIABLES LIKE 'character_set%';,重点看character_set_client、character_set_connection、character_set_results三者必须全是utf8mb4
想复制带索引/触发器/分区的完整表?别信右键菜单里的“复制为”
「复制为」只生成基础 CREATE TABLE,索引名被重命名、触发器完全丢失、分区定义被砍成普通表。真要保全,得靠 DDL 导出 + 手动拼接。
- 右键表 →「对象信息」→ 切换到「DDL」页签,复制全部内容(含
KEY、FULLTEXT、TRIGGER、PARTITION) - 注意
DEFINER=`root`@`%`这种语句,在目标库执行前得替换成当前用户,否则报ERROR 1449 (HY000): The user specified as a definer does not exist - 分区表尤其小心:
CREATE TABLE ... PARTITION BY RANGE (id) (...) PARTITIONS 4这类语句在低版本 MySQL 不支持,需先查目标库SELECT VERSION();
DDL 的完整性永远取决于你复制时有没有拉到底部——Navicat 的 DDL 页签默认只显示前几屏,滚动条不动的话,分区定义和最后的 DELIMITER 块根本看不到。


















