navicat报error 1064大概率因连接显示版本与目标库真实版本不一致,需执行select version()和select @@version_comment;确认真实版本,再匹配navicat兼容性模式并用“运行sql文件”方式执行。
navicat 执行 sql 脚本报 error 1064(语法错误),大概率不是你写错了,而是 navicat 当前连接的数据库版本和目标库实际版本不一致,导致它生成或发送了目标库不认的语法。
查清 Navicat 连接显示的版本和目标库真实版本是否一致
Navicat 在「连接属性」里显示的「服务器版本」只是它初次握手时收到的信息,可能被代理、中间件或配置缓存误导;而目标库实际运行的版本,必须亲自查。
- 在 Navicat 中连上目标库,执行
SELECT VERSION();—— 这个结果才是真实版本 - 再执行
SELECT @@version_comment;,看是否带云厂商定制标识(如阿里云 RDS 的MySQL Community Server (Aliyun)),它们常阉割或延迟支持新语法 - 如果结果是
5.7.42或更低,但 Navicat 连接属性里写的是8.0.33,说明 Navicat 是用高版本连接参数连上的,但它生成的 DDL 会默认按 8.0 写
重点盯住这几个高危语法点,直接搜 SQL 文件
打开 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+ 的「结构同步」或「数据传输」向导里,高级设置中藏着关键开关,不点开根本看不到:
- 进入同步设置 → 点「选项」→ 「高级」→ 找到「Compatibility Mode」下拉菜单
- 明确选中目标库真实版本,比如
MySQL 5.7(不是留空,不是选自动) - 这个选项生效后,Navicat 会主动禁用
CREATE OR REPLACE、移除ALGORITHM子句、把utf8mb4_0900_ai_ci自动降级为utf8mb4_general_ci - 注意:Navicat 15 及更早版没有该选项,只能手改 SQL 文件或升级客户端
别信“粘贴执行”,必须用“运行 SQL 文件”并勾选 UTF-8
复制粘贴进查询编辑器执行大脚本,本质是客户端逐条解析+发送,容易因超时、BOM 头、换行符丢失中断;而「运行 SQL 文件」走服务端直读,跳过客户端预检,成功率高得多:
- 右键连接 → 「运行 SQL 文件」,不是「新建查询」→ 粘贴
- 务必勾选「使用 UTF-8 编码读取文件」,且确认 SQL 文件本身是
UTF-8 无 BOM格式(用 VS Code 底部状态栏看) - 若脚本含中文注释或字段名,没勾这个选项,引号和分号极易被乱码吞掉,报错行号完全对不上
版本不匹配的问题,表面是语法报错,根子在 Navicat 的「信任假设」——它默认你连的就是目标库,且版本一致。一旦这个假设崩了,所有自动生成的 DDL 都可能变成炸弹。最省事的方式,永远是先查 VERSION(),再动手,而不是先试再猜。











