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

标签 mysql innodb myisam

我正在将数据库从 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='';

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

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

关于mysql - 将MyISAM转换为InnoDb错误时间日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65376527/

相关文章:

mysql - 为什么使用 InnoDB 而不是 MySIAM

mysql - 我无法将 myISAM 转换为 innodb

MySQL存储过程中 "Lock Table"的替代方案

sql - 是否可以取代 mysql 中的 ORDER BY 子句?

mysql - SQL 无法创建表 errno 150

mysql - 高效的 MySQL 搜索

Mysql查询没有优化而且很慢,但是为什么?

MySQL 最大 varchar 索引长度超过 3072 字节。这怎么可能?

用于查找名称的mysql查询包括特殊字符单引号

java - 从 MySQL 到 MariaDB 的 Web 应用程序应该进行哪些更改?