MySQL更新错误日期时间值不正确

时间:2018-06-11 16:44:55

标签: mysql datetime

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

但是,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而不是' 00:00:00'。

1 个答案:

答案 0 :(得分:0)

NO_ENGINE_SUBSTITUTION SQL mode与日期没有任何关系。它仅对您有用,因为通过设置它,您还删除了服务器的默认模式,在现代版本中,该模式为TRADITIONAL的行,它是一种组合模式,其中包括{{3} }和NO_ZERO_IN_DATE

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

SET @@SESSION.sql_mode = '';