Navicat 15生成的结构同步脚本默认不兼容MariaDB,因其基于MySQL协议设计,使用DEFINER、ALGORITHM=INSTANT、ROW_FORMAT=DYNAMIC等MariaDB不支持或行为不同的语法,且15版无MariaDB版本识别能力,需手动修改脚本。
Navicat 15 生成的结构同步脚本默认不兼容 MariaDB
navicat 15 的结构同步功能基于 mysql 协议设计,生成的 ddl 脚本默认使用 mysql 专属语法和行为假设(如 auto_increment 处理、definer 子句、algorithm=instant),而 mariadb 在 10.3+ 虽兼容大部分,但关键几处会直接报错或静默失效。
最常触发失败的 3 类语法差异
脚本执行卡在第一步,往往不是连接问题,而是以下语法被 MariaDB 拒绝:
-
CREATE DEFINER=`user`@`host` PROCEDURE ...:MariaDB 默认禁用DEFINER,除非显式启用SQL SECURITY DEFINER并授予SET_USER_ID权限;Navicat 15 不会自动降级为SQL SECURITY INVOKER -
ALTER TABLE t ADD COLUMN c INT ALGORITHM=INSTANT:MariaDB 不支持ALGORITHM=INSTANT,只认ALGORITHM=INPLACE或省略;该语句直接报错ERROR 1064 (42000) -
ENGINE=InnoDB ROW_FORMAT=DYNAMIC:MariaDB 10.2+ 默认用ROW_FORMAT=COMPACT,若表已存在且格式不匹配,ALTER TABLE ... CONVERT TO会失败,而非自动转换
为什么 Navicat 15 不提示 MariaDB 兼容性问题
Navicat 15 的连接驱动层把 MariaDB 当作 “MySQL 兼容模式” 处理,不校验实际服务端版本特性。它只检查连接是否成功,不解析 SELECT VERSION() 返回值中的 -MariaDB 标识,因此向导全程无警告,直到脚本执行才崩。
- 手动确认方式:
SELECT VERSION()返回类似10.11.9-MariaDB,而 Navicat 15 的「连接属性」里仍显示 "MySQL" - 对比工具链差异:Navicat 16+ 已加入 MariaDB 驱动识别逻辑,15 版本无此能力
- 规避方法:在 Navicat 同步向导 → 「选项」→ 取消勾选
Generate DEFINER clause和Use instant algorithm if available
执行前必须手动清理的脚本内容
Navicat 15 导出的脚本不能直接扔进 MariaDB 执行,至少要删/改这三处:
- 全局替换掉所有
ALGORITHM=INSTANT为ALGORITHM=INPLACE(或直接删掉整段ALGORITHM=...) - 删掉每条
CREATE PROCEDURE/CREATE FUNCTION开头的DEFINER=`xxx`@`xxx`,保留SQL SECURITY INVOKER - 对含
ROW_FORMAT的CREATE TABLE,检查目标 MariaDB 版本是否支持该格式;不支持就删掉整段ROW_FORMAT=...,让引擎用默认值
真正麻烦的不是语法本身,而是 Navicat 15 不提供“按目标数据库类型生成脚本”的开关——它只认驱动名,不认后端真实能力。你得把脚本当半成品,每次同步前都过一遍正则替换。


















