Navicat 17 同步至 MariaDB 报错主因是默认按 MySQL 8.0 生成 DDL,需开启 MariaDB 兼容模式、勾选自动转义关键字,并禁用 CREATE OR REPLACE、utf8mb4_0900_as_cs 及 ALGORITHM/LOCK 子句。
navicat 17 同步模型到 mariadb 报语法错误,大概率不是 navicat 坏了,而是它默认按 mysql 8.0+ 规则生成 ddl,而 mariadb(尤其 10.3–10.6)不认这些写法。必须手动干预生成逻辑。
同步时触发 CREATE OR REPLACE 导致报错
MariaDB 不支持 CREATE OR REPLACE TABLE 或 CREATE OR REPLACE VIEW,但 Navicat 17 默认启用该语法(尤其在「结构同步」→「高级」→「DDL Options」里未关掉)。一旦源库有视图或表名冲突,它就直接扔出 CREATE OR REPLACE,MariaDB 解析器立刻拒绝。
- 进同步向导 → 「高级」→ 「兼容性模式(Compatibility Mode)」→ 明确选
MariaDB 10.3或更低(如不确定目标版本,选MariaDB 10.2更稳妥) - 该选项开启后,Navicat 会自动把
CREATE OR REPLACE拆成DROP+CREATE两步 - 若已勾选兼容模式仍报错,检查是否同时开了「Generate DROP statements」——这个选项必须和兼容模式联动才生效,否则 DROP 部分可能裸写、不带反引号
utf8mb4_0900_as_cs 排序规则在 MariaDB 上不存在
Navicat 17 默认从 MySQL 8.0 环境读取字符集配置,会把列的排序规则写成 utf8mb4_0900_as_cs。但 MariaDB 最高只支持到 utf8mb4_unicode_ci 或 utf8mb4_general_ci(10.6 起新增 utf8mb4_0900_as_cs 的有限支持,但行为不一致),一执行就报 Unknown collation。
- 必须开「兼容性模式」并指定 MariaDB 版本,Navicat 才会自动降级为
utf8mb4_general_ci - 若目标库是 MariaDB 10.5 及以下,千万别选 MySQL 8.0 兼容模式,否则即使开了 Auto-escape keywords 也救不了排序规则
- 临时验证:在 MariaDB 中执行
SHOW COLLATION LIKE 'utf8mb4%';,确认列表里有没有utf8mb4_0900_as_cs—— 没有就别让它出现在 DDL 里
关键字没加反引号,order/group 这类表名直接崩
Navicat 17 默认关闭 Auto-escape keywords,遇到源库表名叫 order、admin、resource 就直接生成 CREATE TABLE order (…),MariaDB 把 order 当成关键字解析,报 You have an error in your SQL syntax。
- 路径:同步向导 → 「高级」→ 「DDL Options」→ 勾选
Auto-escape keywords - 这个选项对 MariaDB 和 MySQL 通用,但 MariaDB 8.0+ 保留字列表和 MySQL 不完全重合,所以不能靠“记得几个词”来人工规避
- 开了之后,Navicat 会扫描所有对象名,命中保留字就包上
`order`;但注意:如果同步前你手动编辑过导出的 SQL 并删了反引号,错误会立刻回归
ALGORITHM=INSTANT / LOCK=NONE 被 MariaDB 忽略或拒绝
MySQL 8.0 支持 ALGORITHM=INSTANT 和 LOCK=NONE 用于在线 DDL,但 MariaDB 对这两个子句要么不识别、要么语义不同。Navicat 17 若没设兼容模式,会原样带上这些子句,导致语法错误或意外锁表。
- 兼容性模式启用后,Navicat 会彻底移除所有
ALGORITHM和LOCK显式子句 - MariaDB 10.3–10.5 实际支持部分 online DDL,但不通过这两个关键词控制,而是由引擎内部判断——所以删掉反而是安全的
- 如果你依赖 instant add column 等特性,得确认 MariaDB 版本是否真支持(查
SELECT @@version;+ 官方文档),而不是指望 Navicat 生成的语句能跑通
真正麻烦的不是某一条报错,而是 Navicat 17 把多个问题打包进一个 SQL 文件:一会儿是排序规则错,一会儿是关键字裸写,一会儿又冒出 LOCK 子句。必须一次性把「兼容性模式」和「Auto-escape keywords」全打开,且目标版本选准,少一个环节,同步脚本就可能在第 37 行突然终止。


















