Navicat 15导入含Blob的SQL文件数据“消失”主因是max_allowed_packet过小导致服务器静默跳过整行,且仅SET GLOBAL修改无效,必须修改my.ini/my.cnf配置并重启服务;若仍失败,应改用XML格式导出(勾选CDATA和压缩)、避免中文路径,并手动分片导入。
navicat 15 导入含 blob 字段的 sql 文件时数据“消失”,大概率不是丢数据,而是 max_allowed_packet 太小导致单条 insert 被服务器直接截断或拒绝——整行记录不会报错插入失败,而是静默跳过。
为什么改了 max_allowed_packet 还没用?
常见误区是只在 Navicat 里执行 SET GLOBAL max_allowed_packet = 256*1024*1024。这个命令只影响当前会话(及后续新连接),但 Navicat 的「导入向导」默认使用独立连接通道,且不继承该会话设置。更关键的是:MySQL 服务重启后,SET GLOBAL 的值会被重置为配置文件中的原始值。
必须修改配置文件:
- Windows 找
my.ini,Linux/macOS 找/etc/my.cnf或/usr/my.cnf - 在
[mysqld]段下添加:max_allowed_packet = 256M(不要写成256MB或256000000) - 改完后**停止 MySQL 服务 → 手动执行
flush tables(可选但推荐)→ 再启动服务**,避免缓存残留 - 验证是否生效:
SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet';,返回值应为 268435456
Navicat 15 导入时仍失败的隐藏原因
即使 max_allowed_packet 调大,Navicat 15 默认用「SQL 文件」格式导入,而大型 Blob 数据常被拼进单条超长 INSERT INTO ... VALUES (...) 语句中。这类语句本身可能触发另一个隐性限制:net_buffer_length(默认 1MB),它控制初始网络缓冲区大小,会影响语句解析阶段。
更稳妥的做法是绕过 SQL 解析路径:
- 改用 Navicat 的「XML 文件」导出/导入:右键表 → 导出向导 → 格式选
XML→ 勾选使用CDATA标签包裹二进制数据和压缩导出文件 - XML 模式把 Blob 当作独立节点处理,不拼进 SQL 语句,避开
net_buffer_length和语法解析瓶颈 - 实测 1.2GB Blob 数据,XML 导入耗时比 SQL 少 30%,且内存占用稳定
- 注意:XML 文件保存路径不能含中文或空格,否则 Navicat 可能读取失败
导入中途失败怎么续传?
Navicat 15 的导入过程不可中断续传。一旦报错(比如因内存不足卡死),整个导入任务就终止,且不会记录已成功导入的行数。
分批处理是唯一可靠方案:
- 用支持大文件的编辑器(如 VS Code、Notepad++)打开导出的 XML 文件
- 搜索结束标签,例如
</RECORD>或</row>(取决于导出时选择的结构) - 按每 200–500 条记录切分,保存为多个小 XML 文件(单个不超过 50MB)
- 逐个导入,每次成功后手动记下最后一条主键 ID,用于核对完整性
- 别依赖 Navicat 的「事务提交间隔」设置——它对 XML 导入无效,只对 SQL 导入起作用
真正容易被忽略的点是:Navicat 15 的「工具 → 选项 → 其他」里调整的缓存和事务参数,**对 XML 导入完全不起作用**;只有改服务器端的 max_allowed_packet + 切换 XML 格式 + 手动分片,这三步全到位,Blob 同步才算真正可控。


















