navicat报error 1064主因是高版本语法适配低版mysql,需先执行select version()和select @@version_comment;确认真实版本,再替换utf8mb4_0900_ai_ci等不兼容语法,并在“运行sql文件”中勾选utf-8执行。
navicat 报“语法错误”,90% 不是你写错了 sql,而是它把高版本语法发给了低版本 mysql——比如把 utf8mb4_0900_ai_ci 或 algorithm=instant 丢给 mysql 5.7,服务端直接返回 error 1064。
查清数据库真实版本,别信 Navicat 连接属性里写的
Navicat 在连接属性中显示的“服务器版本”只是握手时缓存的值,可能被代理、RDS 中间件或旧配置误导。必须亲自连上目标库执行:
-
SELECT VERSION();—— 看内核版本(如5.7.42-log) -
SELECT @@version_comment;—— 看是否带云厂商标识(如MySQL Community Server (Aliyun)),这类定制版常阉割新语法
如果 VERSION() 返回的是 5.7.x,但 Navicat 显示 8.0.33,说明客户端正用高版本协议连接,却按 8.0 生成 DDL,问题根源就在这里。
快速定位 SQL 文件里的高危语法点
打开你的 SQL 文件,在 VS Code 或 Notepad++ 里全局搜索以下关键词。只要目标库 ≤ MySQL 5.7,出现任意一个基本就是报错元凶:
-
utf8mb4_0900_ai_ci或utf8mb4_0900_as_cs→ 替换为utf8mb4_unicode_ci -
CREATE OR REPLACE VIEW→ 改成DROP VIEW IF EXISTS xxx; CREATE VIEW xxx AS -
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP→ MySQL 5.7 只允许一个CURRENT_TIMESTAMP,删掉第二个 -
ALGORITHM=INSTANT、LOCK=NONE、JSON_OBJECT()默认值 → 全是 8.0.12+ 特性,低版本不认 -
datetime(0)、timestamp(3)→ 去掉括号,写成datetime、timestamp
必须手动调低 Navicat 的 Compatibility Mode
Navicat 16+ 的「运行 SQL 文件」或「结构同步」向导里藏着关键开关,不点开不会生效:
- 进入设置 → 点「选项」→ 「高级」→ 找到
Compatibility Mode下拉菜单 - 明确选中你查到的真实版本(例如
MySQL 5.7),不能留空,不能选“自动” - 启用后,Navicat 会自动禁用
CREATE OR REPLACE、移除ALGORITHM子句、把utf8mb4_0900_ai_ci降级为utf8mb4_general_ci
Navicat 15 及更早版没有该选项,只能手改 SQL 或升级客户端。
别用“粘贴执行”,必须用“运行 SQL 文件”并勾选 UTF-8
把大 SQL 复制进查询编辑器执行,本质是客户端逐条解析 + 分段提交,容易因 BOM 头、混合换行符(\r\n vs \n)、超时中断导致语句截断,进而触发 near ')' 类误报。
- 务必使用「运行 SQL 文件」功能
- 勾选「使用 UTF-8 编码读取文件」(若存在)
- 确保文件本身是 UTF-8 无 BOM 格式:在 VS Code 中右下角点击编码 → 「Save with Encoding」→ 「UTF-8」
真正难搞的不是“哪行错了”,而是“为什么这行在 Navicat 里不报错,一进命令行就崩”——因为 Navicat 隐式加了 USE、自动切分语句、补全分号,掩盖了真实输入。命令行才是数据库看到的原始现场。











