MySQL 5.6及更早版本不支持DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,直接导入会报ERROR 1067;需删掉该语法或改用应用层/触发器实现。

DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 直接报错
MySQL 5.6 及更早版本不支持 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 这种写法,而 MariaDB 10.3+ 默认导出就带这个语法。直接导入会触发 ERROR 1067 (42000): Invalid default value。
实操建议:
- 打开导出的
.sql文件,全局搜索并删掉所有DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP(除非目标 MySQL 是 5.7+ 且确认启用了严格模式) - 若字段需要时间戳逻辑,改用应用层或触发器实现,避免依赖 DDL 默认值
- 注意:MariaDB 的
TIMESTAMP字段默认行为和 MySQL 不一致——MariaDB 允许多个TIMESTAMP字段带CURRENT_TIMESTAMP,MySQL 最多只允许一个
Aria/MyISAM 引擎和 PAGE_CHECKSUM 等专属参数
MariaDB 的 Aria 引擎是其独有替代 MyISAM 的方案,MySQL 完全不识别 Aria,也不支持 PAGE_CHECKSUM=1、TRANSACTIONAL=1 等引擎级参数,导入时会报类似 Unknown table option 'PAGE_CHECKSUM' 的错误。
实操建议:
- 迁移前先查清源库引擎分布:
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE ENGINE NOT IN ('InnoDB', 'MyISAM'); - 把
Aria表统一转成InnoDB:ALTER TABLE t1 ENGINE=InnoDB;(需在 MariaDB 中执行,再导出) - 导出前手动清理
CREATE TABLE语句末尾的引擎参数,如删掉PAGE_CHECKSUM=1、ROW_FORMAT=COMPRESSED(若目标 MySQL 版本不支持)
utf8mb4_0900_ai_ci 和其他 MySQL 8.0+ 排序规则无法识别
如果从 MySQL 8.0 导出再迁到 MariaDB,或反过来从高版本 MariaDB(如 10.11)导出含 utf8mb4_0900_ai_ci 的建表语句,目标 MySQL(尤其是 5.7 或更低)会报 Unknown collation: 'utf8mb4_0900_ai_ci'。
实操建议:
- 批量替换 SQL 文件中所有
utf8mb4_0900_ai_ci为utf8mb4_unicode_ci(兼容性更好)或utf8mb4_general_ci(性能略优但排序精度低) - 检查
CHARSET=utf8mb4是否与目标 MySQL 版本匹配:MySQL 5.5 不支持utf8mb4,必须降级为utf8;5.6+ 支持但需确认innodb_large_prefix和row_format配置是否启用 - 别忽略列级 collation —— 某些字段显式声明了
COLLATE utf8mb4_0900_ai_ci,也要一并替换
sql_mode 不一致导致 INSERT 失败或 GROUP BY 报错
MariaDB 默认启用 STRICT_TRANS_TABLES、NO_ZERO_DATE,而很多旧版 MySQL(尤其 5.6)仍用宽松模式。迁移后常见现象:插入 NULL 到 NOT NULL 字段静默转成空串、GROUP BY 查询报 ONLY_FULL_GROUP_BY 错误。
实操建议:
- 导出前在 MariaDB 执行
SELECT @@sql_mode;,记下实际生效的 mode;导入前在 MySQL 中临时设置:SET sql_mode = '...'; - 长期方案是修改 MySQL 的
my.cnf,在[mysqld]下明确写死sql_mode,不要依赖默认值 - 特别注意:MariaDB 的
ORACLE模式或ANSI模式在 MySQL 中不存在,必须剔除
md5(uuid()) 这类函数作为 DEFAULT 值,在 MariaDB 10.2+ 合法,但 MySQL 所有版本都不支持——它只接受字面量,默认值里出现任何函数都会直接拒掉建表语句。


















