我们的数据库使用' 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'。
答案 0 :(得分:0)
NO_ENGINE_SUBSTITUTION
SQL mode与日期没有任何关系。它仅对您有用,因为通过设置它,您还删除了服务器的默认模式,在现代版本中,该模式为TRADITIONAL
的行,它是一种组合模式,其中包括{{3} }和NO_ZERO_IN_DATE
。
您可能只想在会话级别为此应用程序设置旧版模式,例如:
SET @@SESSION.sql_mode = '';