![图片[1]-MySQL 8.0 升级必踩之坑:轻松解决 `Invalid default value for 'comment_date'` 错误](https://share.0f1.top/wwj/site/soft/2025/06/12/20250612160830605.webp)
错误一:[ERR] 1067 - Invalid default value for 'comment_date'
这是导致整个导入过程失败的根本原因。
问题分析
- 原因: MySQL 8.0 对日期时间类型的默认值要求比 5.7 更严格。在 MySQL 5.7 及更早版本中,你可以为
DATETIME或TIMESTAMP类型的字段设置一个'0000-00-00 00:00:00'的无效日期作为默认值。然而,在 MySQL 8.0 中,默认的sql_mode包含了NO_ZERO_DATE和NO_ZERO_IN_DATE模式,这两种模式禁止使用 ‘0000-00-00’ 作为日期。 - 证据: 在你的 SQL 文件中,
wp_comments表的创建语句包含了这两行:`comment_date` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00’,
`comment_date_gmt` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00’,这正是 MySQL 8.0 无法接受的语法。
解决方案
你有两种解决方案,强烈推荐第一种。
方案一 (推荐): 修改 SQL 文件
这是最干净、最符合未来标准的做法。你只需要在导入之前,用文本编辑器修改一下导出的 .sql 文件。
- 用一个好的文本编辑器(如 VS Code, Sublime Text, Notepad++ 等)打开你的
.sql文件。 - 使用“查找和替换”功能:
- 查找内容:
DEFAULT '0000-00-00 00:00:00' - 替换为:
DEFAULT CURRENT_TIMESTAMP或者DEFAULT '1970-01-01 00:00:01' - 解释:
CURRENT_TIMESTAMP: 是一个有效的默认值,表示如果插入时未指定时间,则使用当前时间。对于大多数应用场景是合理的。'1970-01-01 00:00:01': 是一个有效的“哨兵”或“占位符”日期,如果你想保留一个表示“未设置”的特定旧日期,可以使用这个。- 对于 WordPress 的
wp_comments表,使用CURRENT_TIMESTAMP通常是安全的。
- 查找内容:
- 保存修改后的
.sql文件,然后重新尝试导入。
方案二 (不推荐,但可行): 修改 MySQL 8.0 服务器配置
这个方法是让你的新数据库去兼容旧的、不规范的语法,可能会掩盖其他潜在问题。只建议作为临时解决方案。
- 连接到你的 MySQL 8.0 服务器。
- 查看当前的
sql_mode:SELECT @@GLOBAL.sql_mode; - 你会看到一长串值,其中可能包含
NO_ZERO_IN_DATE和NO_ZERO_DATE。 - 修改
sql_mode,从中移除这两个值。例如,如果原来的值是ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,你可以执行:SET GLOBAL sql_mode = ‘ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’; - 注意:
SET GLOBAL只对新建立的连接生效。你需要断开当前连接并重新连接,或者为当前会话设置:SET SESSION sql_mode = ‘ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’; - 修改配置后,再尝试导入你的 SQL 文件。
总结
- 核心问题: MySQL 8.0 不再接受
'0000-00-00 00:00:00'作为DATETIME的默认值。 - 最佳操作:
- 打开你的
.sql导出文件。 - 将所有
DEFAULT '0000-00-00 00:00:00'替换为DEFAULT CURRENT_TIMESTAMP。 - 保存文件。
- 重新导入到 MySQL 8.0.28 中。
- 打开你的
- 结果: 导入将会成功,两个错误都会消失。
© 版权声明
THE END











