当我尝试将“2011/03/13 02:53:50.000000000”插入时间戳列时出现此错误。如果我将 13 更改为 15、14、12 或 11,它就没有问题。我也尝试将 /'s 更改为 -'s 并且仍然不行。
我查看了与此错误相关的其他一些线程,但似乎没有一个适用。
我正在运行版本 5.7.9。
当我尝试将“2011/03/13 02:53:50.000000000”插入时间戳列时出现此错误。如果我将 13 更改为 15、14、12 或 11,它就没有问题。我也尝试将 /'s 更改为 -'s 并且仍然不行。
我查看了与此错误相关的其他一些线程,但似乎没有一个适用。
我正在运行版本 5.7.9。
我花了一段时间才弄清楚这一点......
问题是“2011-03-13 02:53:50”是非法的,因为夏令时在凌晨 2 点到 3 点之间切换,所以在任何 DST 引入日凌晨 2 点到 3 点之间的所有时间值都是无效的。'2016-03-13 02:32:21' 等相同。
将系统时区更改为不使用 DST 的时区,您应该没问题。
你需要试试这个:
STR_TO_DATE( '2011/03/13 02:53:50', '%Y/%m/%d %H:%i:%s')
否则您必须使用破折号分隔符(-)插入日期,例如
'2011-03-13 02:53:50'
仍然不确定问题是什么,可能是 CentOS 和 MySQL 版本的组合。我将列更改为 datatime(6) 而不是 timestamp(6),并且能够成功导入所有数据。
我认为您需要在插入之前在 MySQL 中使用一些 str 转换。或者在对 MySQL 进行查询之前以适当的格式准备数据。
微秒格式也是错误的。MySQL 文档清楚地说明了这一点:
DATETIME 或 TIMESTAMP 值可以包括以微秒(6 位)精度为单位的尾随小数秒部分。
更新:在我的本地主机上,我有相同版本的 MySQL,它可以工作。试图执行转换
select str_to_date("2011-03-13 02:53:50.000000", "%Y-%m-%d %H:%i:%s.%f") as `t`
并得到:
+----------------------------+
| t |
+----------------------------+
| 2011-03-13 02:53:50.000000 |
+----------------------------+
1 row in set (0.00 sec)
这是SQLFiddle,它确认了其他版本的 MySQL 上的内容。
我没有想法,我认为问题与表结构或特定版本的 MySQL+OS 中的“本地故障”有关。