必须手动为字段名加反引号,navicat 不会自动识别或包裹 mysql 保留字;否则同步时因解析器将 order、group 等误作关键字导致 error 1064。
必须手动为字段名加反引号,navicat 不会自动识别或包裹 mysql 保留字。
为什么同步时字段名含 order、group 就报 ERROR 1064
Navicat 在生成同步用的 CREATE TABLE 或 ALTER TABLE 语句时,直接把你在设计表界面填的字段名原样拼进去。如果填的是 order,它就输出 order VARCHAR(50) —— MySQL 解析器立刻把它当成 ORDER BY 关键字,语法树崩掉,报错位置常是 near 'order VARCHAR'。这不是 Navicat 漏转义,而是它压根不校验字段名语义合法性。
常见高危字段名包括:order、group、key、index、desc、limit、admin、resource、role(MySQL 8.0+ 已达 200+ 个保留字)。
怎么在 Navicat 表设计界面正确输入带保留字的字段名
你得自己敲反引号,Navicat 才会在生成 SQL 时保留它:
- 在「字段名」输入框里,**完整输入
`order`(英文反引号,不是单引号或双引号)** - 如果字段名本身含反引号,比如想叫
`id`,需写成``id``(两个连续反引号转义) - 别依赖「自动完成」或界面高亮——Navicat 对保留字完全不提示,灰色图标 ≠ 安全
- 建完表后,右键表 → 「对象信息」→ 切到「DDL」标签页,确认生成语句中该字段是否真被
`包裹;没包住,说明你漏输了
同步前快速筛查哪些字段名可能出问题
别靠猜,用数据库自己查最准:
- 在 Navicat 查询窗口执行:
SELECT * FROM information_schema.KEYWORDS WHERE RESERVED = 'YES' AND WORD IN ('order', 'group', 'admin'); - 或者更直接:在源库运行
CREATE TABLE t1 (`order` INT);,成功说明必须加;CREATE TABLE t1 (order INT);报错则确认踩雷 - 如果已知目标库字段名含敏感词,但同步脚本仍裸写,检查是否同时勾了「Generate DROP statements」——DROP 部分也得被反引号包裹,否则
DROP TABLE order;同样炸
开了 Auto-escape keywords 还报错?重点看这三点
这个选项只影响结构同步生成的 DDL,对数据同步、手动编辑后的 SQL、或 INSERT/UPDATE 语句无效:
- 确认你没手动改过预览页里的 SQL —— 删掉
`就等于白开 - 检查「同步向导 → 高级 → DDL Options」里
Auto-escape keywords确实已勾选,且未被其他配置覆盖 - 如果同步后 INSERT 报 1064,问题不在建表,而在后续语句:Navicat 的「插入行」功能不会自动给字段加反引号,它照搬你当初设计表时输的原始名;哪怕建表侥幸通过,
INSERT INTO t1 (order, name)依然非法
最容易被忽略的是:字段名一旦用了保留字,所有上下文都得加反引号——不只是建表,还包括 SELECT、UPDATE、WHERE、JOIN 中的列引用。Navicat 不替你兜底,它只忠实反映你输入的内容。











