MySQL 5.6.19 TIMESTAMP无法接受许多正确的值

时间:2014-09-15 19:50:00

标签: mysql datetime timestamp mysql-5.6

我遇到了一个非常奇怪的问题,并且不明白这一点。

CREATE TABLE test (time TIMESTAMP NOT NULL DEFAULT NOW()) ENGINE=INNODB;

mysql> insert into test (time) values("2011-03-13 01:08:04");
Query OK, 1 row affected (0.00 sec)

这很好。现在,只将时间改变1小时:

mysql> insert into test (time) values("2011-03-13 02:08:04");
ERROR 1292 (22007): Incorrect datetime value: '2011-03-13 02:08:04' for column 'time' at row 1

这里发生了什么?我随机插入日期时间值,发现无法插入多个值:" 2011-03-13 02:08:04"," 2010-03-14 02: 04:05"," 2009-03-08 02:24:52"," 2009-03-08 02:48:27"," 2011-03 -13 02:06:01"," 2005-04-03 02:00:44" ...

将小时数或1年改为1可以解决问题,但当然不是一个真正的解决方案。

2 个答案:

答案 0 :(得分:4)

这些日期时间看起来很像美国时区的无效值,可以观察夏令时调整。

在3月的一个星期天早上,夏令时时间"向前弹"一小时,有效地在凌晨2点到凌晨3点之间跳过了一小时。凌晨2点到凌晨3点之间的小时不存在,因此指定小时的值不是正确的"值。

您观察到的行为是预期的行为。

请注意,这些值在UTC' time_zone = + 0:00'或在没有观察夏令时的时区中有效。

(另请注意,相反的问题发生在秋季,当时钟"后退"一小时;然后有两个不同的小时,在凌晨2点到凌晨3点之间,具有相同的编码值,但在时区.02:30 CST vs 02:30 CDT)

答案 1 :(得分:0)

夏令时。

In 2011, daylight savings time于3月13日凌晨2点开始。因此,在凌晨2点到凌晨3点之间的任何时间都无效。

MySQL不在严格模式下时会发出警告。如果设置了STRICT_ALL_TABLESSTRICT_TRANS_TABLES,则可以通过发布来取消设置所有sql模式,但应注意不建议这样做。

SET @@sql_mode='';    
insert into test (time) values("2011-03-13 02:08:04");

您仍会收到有关无效时间戳的警告,并且值2011-03-13 03:00:00将插入到您的表格中。