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

Converting MyISAM to InnoDb error timedate format

我正在将数据库从 MyISAM 转换为 InnoDb。我收到错误消息 #1292 Incorrect datetime value: '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 客户端后,会话范围的选项将消失,下次打开会话时,它将采用全局设置中的选项。

这允许更新,因此您可以在查询中使用无效的日期时间字符串至少足够长的时间以将相应的值更改为 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 模式是一件好事,因为它可以防止数据库存储虚假数据值。如果您要存储不适合列的值,严格模式还可以防止数据截断。