navicat导出sql报error 1064主因是连接显示版本与目标库真实版本不一致,需执行select version()和select @@version_comment;确认真实版本,再在导出向导中手动指定compatibility mode(如mysql 5.7),并用“运行sql文件”方式执行且勾选utf-8无bom编码。

Navicat 导出的 SQL 文件在目标库执行报 ERROR 1064,几乎从来不是你手写的 SQL 有错,而是 Navicat 按“它以为的版本”生成了目标库不认的语法——最常见原因就是 SELECT VERSION() 查出的真实版本和 Navicat 连接属性里显示的版本不一致。
确认目标库真实版本,别信 Navicat 连接面板上写的
Navicat 在连接建立时从服务端拿到一个初始版本号,但这个值可能被代理、RDS 中间件或缓存污染。必须亲自连上目标库执行:
-
SELECT VERSION();—— 看主版本,比如5.7.42或8.0.33 -
SELECT @@version_comment;—— 看有没有云厂商定制标识,例如MySQL Community Server (Aliyun),这类实例常阉割新特性
如果 VERSION() 返回 5.7.42,但 Navicat 连接属性里写的是 8.0.33,那所有导出脚本都默认按 8.0 生成,必然在 5.7 上报错。
盯住这几个高危语法点,全局搜索就能快速定位
打开 SQL 文件,在 VS Code 或 Notepad++ 里直接搜以下关键词(目标库是 MySQL 5.7 或更低时,出现任意一个基本就是根源):
-
utf8mb4_0900_ai_ci或utf8mb4_0900_as_cs→ 5.7 不识别,必须替换成utf8mb4_unicode_ci -
CREATE OR REPLACE VIEW→ 5.7 只支持DROP VIEW IF EXISTS+CREATE VIEW -
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP→ 5.7 仅允许一个CURRENT_TIMESTAMP,第二个得删掉 -
ALGORITHM=INSTANT、LOCK=NONE、JSON_OBJECT()默认值 → 全是 8.0.12+ 特性,低版本直拒
必须手动调低 Navicat 导出向导里的兼容性模式
Navicat 16+ 的「转储 SQL 文件」或「结构同步」向导中,那个关键开关藏得很深:
- 明确选中目标库真实版本,比如
MySQL 5.7(不能留空,不能选“自动”) - 这个选项生效后,Navicat 才会真正禁用
CREATE OR REPLACE、移除ALGORITHM子句、把utf8mb4_0900_ai_ci自动降级为utf8mb4_general_ci - Navicat 15 及更早版没有该选项,只能手改 SQL 文件或升级客户端
别用粘贴执行大脚本,必须用「运行 SQL 文件」并勾选 UTF-8
复制粘贴进查询编辑器执行,本质是客户端逐条解析 + 发送,大文件容易超时、BOM 头干扰、换行符丢失;而「运行 SQL 文件」走服务端直读,跳过客户端预检,成功率高得多:
- 务必勾选「使用 UTF-8 编码读取文件」
- 确保文件本身是
UTF-8 without BOM(VS Code 右下角可查,Notepad++ 保存时选“UTF-8 无 BOM”) - 如果文件开头含
DELIMITER $$,Navicat 内部能处理,但命令行mysql -u user -p db 会炸——这不是行尾符问题,是 <code>DELIMITER指令不被服务端识别
真正难搞的永远不是语法本身,而是 Navicat 把“它以为的环境”当成了“目标环境”。版本、字符集、SQL 模式、甚至 BOM 头,任何一个没对齐,都会让同一份 SQL 在不同地方表现迥异——而错误提示总在最后一行,实际病灶却在第一行前面几行的某个括号或引号里。











