Navicat 12 不支持跨文件夹批量导入 SQL 文件:其“运行 SQL 文件”对话框仅接受单个文件路径,拖入多个文件或文件夹会静默失败;必须先用命令行合并各文件夹下的 SQL 为单个无 BOM 的 all.sql,并确保编码、max_allowed_packet 和 DELIMITER 正确。
Navicat 12 不支持跨文件夹批量导入 SQL 文件
直接结论:navicat 12 没有“选中多个文件夹 → 一键执行所有 .sql”的功能,连单文件夹下的多文件都只支持逐个点选。你看到的“运行 sql 文件”对话框只接受单个 .sql 路径,拖入多个文件或整个文件夹会静默失败或报 file not found(即使路径完全正确)。
这不是权限、编码或路径格式问题,而是 Navicat 12 的底层设计限制——它不解析目录结构,也不递归扫描子目录。所有版本(包括 12.x 系列)均如此,和数据库类型(MySQL/PostgreSQL 等)无关。
必须先合并:用命令行按需拼接不同文件夹的 SQL 内容
核心思路是把“多个文件夹下的多个 .sql”变成“一个逻辑上有序的 all.sql”,再交给 Navicat 执行。关键在控制顺序和隔离上下文:
- Windows 下进入父目录(即包含多个子文件夹的目录),用
cmd分别合并每个子文件夹内的 SQL:cd /d D:\scripts<br>type db_a\*.sql > db_a_merged.sql<br>type db_b\*.sql > db_b_merged.sql
再按依赖顺序拼成最终文件:copy /b db_a_merged.sql+db_b_merged.sql all.sql
- macOS/Linux 用
cat,注意路径通配需加引号避免 shell 展开错误:cat "db_a/"*.sql "db_b/"*.sql > all.sql
- 务必删除中间文件里的重复
USE database_name;—— 只保留第一个,其余删掉,否则 Navicat 会在执行中途切换库失败 - 如果某文件夹下 SQL 含
DELIMITER $$,合并后必须手动补全对应DELIMITER ;,否则后续语句全报语法错误
执行前必须检查的三个硬性条件
Navicat 12 对合并后的大文件极其敏感,漏掉任一条件都会导致卡死、中断或乱码:
-
all.sql文件不能带 BOM:用 VS Code 或 Notepad++ 打开,编码选 “UTF-8 无 BOM” 重新保存;带 BOM 会触发Unknown character set: 'utf8mb4' - MySQL 服务端
max_allowed_packet必须调大:默认 4MB 远不够,执行set global max_allowed_packet=1073741824;(1GB),并写入my.cnf持久化 - Navicat 执行时勾选 “以 UTF-8 编码运行”:该选项在“运行 SQL 文件”对话框右下角,未勾选中文注释或字段值会变问号
为什么不用批处理作业或 SOURCE 语句
Navicat 12 的“批处理作业”看似能循环调用多个 SQL 文件,但每个动作都新建连接,CREATE TEMPORARY TABLE、用户变量(@var)、事务状态全丢失;而 SOURCE 'path/file.sql'; 是 MySQL 命令行专属语法,Navicat 查询窗口根本不识别,直接报 Unknown command。
真正不可绕过的是:Navicat 12 的 SQL 执行器只吃“单连接 + 单流文本”,任何想让它“自动跳转路径”或“理解目录层级”的尝试,都会在第一步就失败。











