MySQL:数据截断错误:日期时间值不正确:'2006-10-01 02:22:44'。

16

我使用JDBC通过MySQL更新一行时,遇到以下异常:

com.mysql.jdbc.MysqlDataTruncation: 数据截断:日期时间值不正确:'2006-10-01 02:22:44'

该列定义为:

'created_on_service timestamp NULL DEFAULT NULL'

该列上没有索引或外键。

显然这不是数据类型的问题。我在该表中有来自该日期时间之前和之后的值。也有早于和晚于凌晨2:22的时间值。


这可能会有所帮助 https://dev59.com/qXVD5IYBdhLWcg3wJIAK - Rasika
1
那个链接是关于文本数据的,具体来说是多字节字符集。它不适用。在发布之前,我确实在StackOverflow上搜索了类似的问题,但很遗憾没有找到。 - Cam Price-Austin
5个回答

23

问题已经解决。

原来,2006年10月1日是南澳大利亚州开始实行夏令时的日期。在凌晨2点钟时,时钟向前拨动一小时,因此那天并没有2:22am这个时间点:直接跳过了2:00am到3:01am。

我将更改数据库的时区为UTC,这应该可以解决这个问题。


如果更改数据库时区不可行,想了解我们还有哪些其他选项。尽管如此,您通过指出问题确实节省了很多脑力。 - linuxeasy

5

我通过升级MySQL连接器JAR文件并将mysql.jar复制到Tomcat lib目录中,解决了同样的问题(com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '' for column 'perev_start_time' at row 1)。

MySQL服务器版本为5.6,MySQL连接器是mysql-connector-java-5.1.30-bin.jar


欢迎来到Stack Overflow。一般情况下,跟进问题不应该作为答案发布,而是应该单独提问。但是,可以随意链接回这个问题。 - Pokechu22
4
这似乎不是一个新问题。 - AbcAeffchen

3
我们升级了MySQL服务器,但没有升级mysql连接器jar。我们遇到了这个问题。后来我发现是旧的jar导致的。我将其升级后,这个问题就解决了。

3
我的问题也是由于DST引起的。我通过将列数据类型从timestamp更改为datetime来解决它。这个答案简单描述了两者之间的区别:
  • timestamp 将时间作为Unix纪元时间存储,因此根据服务器的时区将其转换为/从UTC。一旦更改服务器时区,您就会对 INSERT / UPDATE 有不同的解释和不同的 SELECT 结果。由于DST,某些时间点无效;
  • datetime 以原样存储时间,而不考虑服务器时区。当传递UTC时间时,任何时间都是有效的(没有DST“空洞”)。

注意:您可能仍然需要处理“缺失”的时间。此方法只是将责任从DB级别转移到应用程序级别。

另请参见:MySQL文档 中的TIMESTAMP vs DATETIME。


0

您没有展示确切的更新SQL语句。但是可能您忘记了日期部分。

正确的格式是yyyy-mm-dd hh:mm:ss格式。

日期值应该采用以下格式2011-11-01 12:32:01。


我正在使用JDBC,因此确切的SQL被隐藏了,但是根据我收到的错误消息来看,该值已经以yyyy-mm-dd hh:mm:ss格式存在。 - Cam Price-Austin
对于Java而言,使用24小时制的真实格式应该是:"yyyy-MM-dd HH:mm:ss"。 - theINtoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接