我使用JDBC通过MySQL更新一行时,遇到以下异常:
com.mysql.jdbc.MysqlDataTruncation: 数据截断:日期时间值不正确:'2006-10-01 02:22:44'
该列定义为:
'
created_on_service
timestamp NULL DEFAULT NULL'
该列上没有索引或外键。
显然这不是数据类型的问题。我在该表中有来自该日期时间之前和之后的值。也有早于和晚于凌晨2:22的时间值。
我使用JDBC通过MySQL更新一行时,遇到以下异常:
com.mysql.jdbc.MysqlDataTruncation: 数据截断:日期时间值不正确:'2006-10-01 02:22:44'
该列定义为:
'
created_on_service
timestamp NULL DEFAULT NULL'
该列上没有索引或外键。
显然这不是数据类型的问题。我在该表中有来自该日期时间之前和之后的值。也有早于和晚于凌晨2:22的时间值。
问题已经解决。
原来,2006年10月1日是南澳大利亚州开始实行夏令时的日期。在凌晨2点钟时,时钟向前拨动一小时,因此那天并没有2:22am这个时间点:直接跳过了2:00am到3:01am。
我将更改数据库的时区为UTC,这应该可以解决这个问题。
我通过升级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
。
timestamp
更改为datetime
来解决它。这个答案简单描述了两者之间的区别:
INSERT
/ UPDATE
有不同的解释和不同的 SELECT
结果。由于DST,某些时间点无效;注意:您可能仍然需要处理“缺失”的时间。此方法只是将责任从DB级别转移到应用程序级别。
另请参见:MySQL文档 中的TIMESTAMP vs DATETIME。
您没有展示确切的更新SQL语句。但是可能您忘记了日期部分。
正确的格式是yyyy-mm-dd hh:mm:ss格式。
日期值应该采用以下格式2011-11-01 12:32:01。