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

时间:2011-09-27 04:54:50

标签: mysql jdbc

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

  

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

该列定义为:

  

'created_on_service时间戳NULL DEFAULT NULL'

该列上没有索引或外键。

显然,这不是数据类型的问题。我在该日期时间之前和之后都有该表中的值。我也有在上午2:22之前和之后的时间值。

5 个答案:

答案 0 :(得分:17)

解决了它。

事实证明,2006年10月1日在南澳大利亚是夏令时的开始。时钟在凌晨2点开始向前设置一小时,所以当天凌晨2点22分没有:它从凌晨2点直到凌晨3点01分。

我会将db时区更改为UTC,这应解决此问题。

答案 1 :(得分:4)

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

MySQL Server的版本是5.6,MySQL连接器是mysql-connector-java-5.1.30-bin.jar

答案 2 :(得分:2)

我们升级了MySQL服务器,但没有升级mysql连接器jar。我们遇到了这个问题。后来我发现这是因为旧罐子。我升级了它,这个问题就消失了。

答案 3 :(得分:0)

您没有显示确切的更新SQL。但可能你忘了日期部分

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

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

答案 4 :(得分:0)

我的问题也是由DST引起的。我已将列数据类型从timestamp更改为datetime,从而解决了这个问题。这个answer描述了差异,简而言之:

  • 时间戳将时间存储为Unix epoch time,因此根据服务器的时区将其转换为UTC或从UTC转换。更改服务器时区后,您对INSERT / UPDATE和不同的SELECT结果有不同的解释。由于夏令时,某些时间点无效;
  • datetime 按原样存储时间,与服务器时区无关。传递UTC时间时,任何时间都有效(没有DST"漏洞")。

注意:您可能仍需要处理"缺失"时间。这种方法只是将责任从数据库级别转移到应用程序级别。

另请参阅:TIMESTAMP与DATETIME的MySQL documentation