MySQL 8.0 升级必踩之坑:轻松解决 Invalid default value for ‘comment_date’ 错误

图片[1]-MySQL 8.0 升级必踩之坑:轻松解决 `Invalid default value for 'comment_date'` 错误


错误一:[ERR] 1067 - Invalid default value for 'comment_date'

这是导致整个导入过程失败的根本原因

问题分析

  • 原因: MySQL 8.0 对日期时间类型的默认值要求比 5.7 更严格。在 MySQL 5.7 及更早版本中,你可以为 DATETIMETIMESTAMP 类型的字段设置一个 '0000-00-00 00:00:00' 的无效日期作为默认值。然而,在 MySQL 8.0 中,默认的 sql_mode 包含了 NO_ZERO_DATENO_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 文件。

  1. 用一个好的文本编辑器(如 VS Code, Sublime Text, Notepad++ 等)打开你的 .sql 文件。
  2. 使用“查找和替换”功能:
    • 查找内容: 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 通常是安全的。
  3. 保存修改后的 .sql 文件,然后重新尝试导入。

方案二 (不推荐,但可行): 修改 MySQL 8.0 服务器配置

这个方法是让你的新数据库去兼容旧的、不规范的语法,可能会掩盖其他潜在问题。只建议作为临时解决方案。

  1. 连接到你的 MySQL 8.0 服务器。
  2. 查看当前的 sql_mode:SELECT @@GLOBAL.sql_mode;
  3. 你会看到一长串值,其中可能包含 NO_ZERO_IN_DATENO_ZERO_DATE
  4. 修改 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’;
  5. 注意: SET GLOBAL 只对新建立的连接生效。你需要断开当前连接并重新连接,或者为当前会话设置:SET SESSION sql_mode = ‘ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’;
  6. 修改配置后,再尝试导入你的 SQL 文件。

总结

  1. 核心问题: MySQL 8.0 不再接受 '0000-00-00 00:00:00' 作为 DATETIME 的默认值。
  2. 最佳操作:
    • 打开你的 .sql 导出文件。
    • 将所有 DEFAULT '0000-00-00 00:00:00' 替换为 DEFAULT CURRENT_TIMESTAMP
    • 保存文件。
    • 重新导入到 MySQL 8.0.28 中。
  3. 结果: 导入将会成功,两个错误都会消失。
© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享