MySQL - 通过JDBC将UTC时间戳传递给sprocs

时间:2011-01-19 00:54:38

标签: mysql stored-procedures jdbc timezone

我将MySQL服务器设置为UTC(@@ global.time_zone ='+ 00:00')和一个带有DATETIME列的表,其中我以UTC格式存储日期。当我通过JDBC调用存储过程时,我遇到了生成UTC日期的问题。例如:

java.util.Date now = new java.util.Date();
sproc = conn.prepareCall("{call TzTestInsert(?)}");
sproc.setTimestamp(1, new java.sql.Timestamp(now.getTime()), Calendar.getInstance(TimeZone.getTimeZone("GMT+00:00")));
sproc.execute();

TzTestInsert sproc只需要一个DATETIME并将其插入表中。

我希望数据库现在以UTC格式保存当前时间,但实际上它保留了我的时区的当前时间。

如果我改变了sproc以取一个字符串就可以了......

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
...
sproc.setString(1, dateFormat.format(now));

但我宁愿在sproc中使用正确的类型。

如果我绕过了sproc,也可以工作,但同样不是我首选的解决方案......

String sql = "INSERT INTO TzTest VALUES('" + dateFormat.format(now) + "') ;

对于原始的sproc,如果我在sproc和table中使用TIMESTAMP数据类型,我会遇到同样的问题,这对于UTC中的服务器来说并不奇怪,因为任何特定于MySQL TIMESTAMP的时区转换都应该是noops。

从MySQL Workbench连接调用sproc工作正常,例如

CALL TzTestInsert(UTC_TIMESTAMP());

似乎问题出在JDBC中。我查看了各种时区连接参数,但没有找到任何有意义的连接参数。

我必须遗漏一些基本的东西 - 很多人这样做,对吗?

1 个答案:

答案 0 :(得分:0)

解决方案是传递JDBC驱动程序“useLegacyDatetimeCode = false”。请参阅mysql错误http://bugs.mysql.com/bug.php?id=15604

看起来他们将旧代码留在驱动程序中以实现向后兼容。