为什么?
在这项计划中,我有:
`date_published` DATETIME NOT NULL,
但现在当我:
mysql> select min(date_published) from articles;
+---------------------+
| min(date_published) |
+---------------------+
| 0000-00-00 00:00:00 |
+---------------------+
1 row in set (5.47 sec)
但当我:
mysql> select * from articles where date_published = '0000-00-00 00:00:00';
ERROR 1525 (HY000): Incorrect DATETIME value: '0000-00-00 00:00:00'
我不明白。我是怎么插进去的?
如何查找包含此日期的行?
更新
>>> db.execute("INSERT INTO articles (edition_id, url, date_published, title, weight) VALUES (%s, %s, %s, %s, %s)", (1, "", "0000-00-00 00:00:00", "", 0))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
... yadda yadda stack trace
packages/mysql/connector/connection.py", line 784, in _handle_result
raise get_exception(packet)
mysql.connector.errors.DataError: 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'date_published' at row 1
我在MySQL客户端和代码中都尝试过。当我测试它时,这两个似乎都不起作用,但该行在表中。
更新2
在为会话禁用客户端中的NO_ZERO_DATE
之后,我能够找到导致此问题的行。
它们的插入日期为'0003-01-26 00:00:00+00:00'
现在,当我查询它时,我找到了它们,但如果0003:
mysql> select date_published from articles where date_published = '0003-01-26 00:00:00+00:00';
+---------------------+
| date_published |
+---------------------+
| 0000-00-00 00:00:00 |
| 0000-00-00 00:00:00 |
| 0000-00-00 00:00:00 |
| 0000-00-00 00:00:00 |
+---------------------+
4 rows in set (5.41 sec)
+00:00
很重要,否则我会得到一个空集。
1条答案
按热度按时间dluptydi1#
您可能在过去MySQL Server配置允许的某个时间插入了零日期。
过去默认允许日期为零,从MySQL 5.7开始,默认情况下不允许。这被认为是一种改进,因为0000-00-00不是有效的日期。也就是说,它不会出现在任何日历中。
确定是否允许这些日期的配置是SQL模式NO_ZERO_DATE。启用此模式时,将‘0000-00-00 00 00:00:00’转换为日期时间值的SQL表达式将返回错误。
如果该数据已经存储在您的表中,您至少可以获取它。但是您不能形成这样的新值,包括您在WHERE子句中使用的文字值。
要搜索该值,您必须更改
sql_mode
配置选项,至少要在运行该查询的会话中临时更改。我建议不要在全球范围内改变它。不允许无效日期是一件好事。手册上写道:
因为NO_ZERO_DATE已被弃用;预计它将在未来的MySQL版本中作为单独的模式名称被删除,并且其效果将包含在严格SQL模式的影响中。
因此,在MySQL某些未来版本中,您可能必须禁用严格模式才能访问这些日期值。我建议您现在将这些值替换为某个有效的DateTime值,否则为NULL。