本地MySQL5.7导入数据库至MariaDB5.5服务器报1067错误
错误根因
这是典型的跨版本数据库语法兼容问题:
- MariaDB 5.5、MySQL 5.5及更早版本,不支持给
DATETIME类型字段设置CURRENT_TIMESTAMP作为默认值,这个特性是MySQL 5.6、MariaDB 10.0之后才加入的。 - 本地使用的MySQL 5.7支持该语法,导出的建表语句直接保留了
created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP的写法,导入到低版本的MariaDB 5.5.68时,数据库无法识别这个默认值配置,直接抛出1067错误。
补充说明:在5.5版本的数据库里,只有TIMESTAMP类型字段原生支持CURRENT_TIMESTAMP作为默认值,这是该版本最常见的兼容坑点之一。
解决方案
按推荐优先级排序:
- 方案1:升级服务器数据库版本
最稳妥的长期方案,将服务器端的MariaDB升级到10.0及以上版本,和本地MySQL 5.7的语法特性完全对齐,无需修改导出的SQL内容即可直接导入,后续也不会碰到其他5.5版本缺失新特性导致的兼容问题。 - 方案2:修改建表语句适配低版本
如果暂时没有升级数据库的条件,可以把对应字段的类型从DATETIME调整为TIMESTAMP,修改后的字段定义如下:
注意:`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,TIMESTAMP类型的可存储时间范围为1970年-2038年,如果业务需要存储2038年之后的时间数据,不要使用这个方案。 - 方案3:临时调整SQL模式跳过校验
仅适合临时测试场景使用,生产环境不推荐。导入前先在目标数据库执行以下语句,关闭会话级的严格日期校验:
执行完成后再重新运行导入命令即可,这个方案可能导致后续写入的时间字段出现非预期的零值、异常值,稳定性没有保障。SET SESSION sql_mode = '';
内容的提问来源于stack exchange,提问作者itdoesntmatter1222
相关产品推荐
相关产品推荐

