【问题标题】:MySQL - Passing UTC timestamps to sprocs via JDBCMySQL - 通过 JDBC 将 UTC 时间戳传递给存储过程
【发布时间】:2011-06-11 11:17:19
【问题描述】:

我有一个 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 保存我的当前时间,但实际上它保存了我的时区的当前时间。

如果我将存储过程更改为获取字符串,它可以工作...

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

但我宁愿在存储过程中使用正确的类型。

如果我绕过存储过程也可以,但又不是我的首选解决方案...

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

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

从 MySQL Workbench 连接调用存储过程可以正常工作,例如

CALL TzTestInsert(UTC_TIMESTAMP());

似乎问题出在 JDBC 中。我查看了各种时区连接参数,但没有发现任何影响。

我一定错过了一些基本的东西 - 很多人都这样做,对吧?

【问题讨论】:

    标签: mysql stored-procedures jdbc timezone


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-13
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多