首页 > 解决方案 > MySQL 更新错误不正确的日期时间值

问题描述

我们的数据库使用“0000-00-00 00:00:00”作为许多日期时间和时间戳字段的默认值。MySQL 显然已经决定他们只希望我们对这些类型的字段使用有效的日期或 null。

但是,“0000-00-00 00:00:00”值过去是可以接受的,我们的代码会检查该值。当我设置一个新服务器时,我编辑 /etc/mysql/mysql.conf.d/mysqld.cnf 文件并在 [mysqld] 部分添加一行。

sql_mode=NO_ENGINE_SUBSTITUTION

今天我试图设置一个新的服务器。我添加sql_mode=NO_ENGINE_SUBSTITUTION到 MySQL 配置并重新启动 mysql 服务。但是,这个新服务器只会出错。

UPDATE example_table SET active = 1 WHERE example_table_id = 1;
ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'my_date_field' at row 1

我当然可以将数据库更新为具有 NULL 值或“有效”默认日期,例如“1970-01-01 00:00:01”,但这会破坏检查数据是否为“0000-00-00”的现有代码00:00:00'。

附加示例信息:

Server type: MySQL
Server version: 5.7.22-0ubuntu0.16.04.1 - (Ubuntu)
Protocol version: 10
innodb_version: 5.7.22

SELECT my_date_field FROM example_table WHERE active = 1;
+---------------------+
| my_date_field       |
+---------------------+
| 0000-00-00 00:00:00 |
+---------------------+


DESC example_table;
+------------------------------------+--------------+------+-----+---------------------+
| Field                              | Type         | Null | Key | Default             |
+------------------------------------+--------------+------+-----+---------------------+
| my_date_field                      | datetime     | NO   |     | 0000-00-00 00:00:00 |
| active                             | tinyint(2)   | NO   |     | 1                   |
+------------------------------------+--------------+------+-----+---------------------+

我在同一版本的 MySQL 上使用了其他机器,sql_mode=NO_ENGINE_SUBSTITUTION我几乎要为这台新机器映像其中一台机器,直到更新代码以查找有效日期或 null而不是“0000-00-00 00:00:00”。

标签: mysqldatetime

解决方案


NO_ENGINE_SUBSTITUTIONSQL 模式与日期没有任何关系。它只是为您解决了问题,因为通过设置它,您还删除了服务器的默认模式,在现代版本中TRADITIONAL,它是一种组合模式,其中包括NO_ZERO_IN_DATENO_ZERO_DATE.

您可能只想在会话级别为此应用程序设置旧模式,例如:

SET @@SESSION.sql_mode = '';

推荐阅读