将 MyISAM 转换为 InnoDb 错误时间日期格式

问题描述

我正在将数据库从 MyISAM 转换为 InnoDb。我收到错误 #1292 不正确的日期时间值:'0000-00-00 00:00:00'。我已经阅读了其中一些错误,但我无法更改信息存储到数据库的方式。它以上述格式存储。有什么好的解决办法吗?

解决方法

错误如下:

mysql> update mytable set d = null where d = '0000-00-00 00:00:00';
ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'd' at row 1

为什么会出现这个问题?因为 '0000-00-00 00:00:00' 违反了 sql 模式 NO_ZERO_DATE 和 NO_ZERO_IN_DATE。在 MySQL 8.0 中,当您使用 STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES 时,这些模式是隐式的。

在与日期时间比较时仅在 WHERE 子句中使用该值会触发违规,因为 MySQL 会尝试将该字符串转换为日期时间值。

这是一个解决方案:暂时将 sql 模式更改为非严格模式,以允许无效的日期值。

mysql> set sql_mode='';

这只会在您当前的会话期间更改 sql_mode。一旦退出 mysql 客户端,会话范围的选项将消失,下次打开会话时,它将从全局设置中获取选项。

这允许 UPDATE,因此您可以在查询中使用该无效日期时间字符串至少足够长以将相应的值更改为 NULL。

mysql> update mytable set d = null where d = '0000-00-00 00:00:00';
Query OK,1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from mytable;
+----+------+
| id | d    |
+----+------+
|  1 | NULL |
+----+------+

除了这个清理操作,不要让你的sql模式不严格。使用严格的 sql 模式是一件好事,因为它可以防止数据库存储虚假数据值。严格模式还可以防止数据截断,如果您要存储不适合列的值。