mysql-connector-j 8.0-设置SqlTimestampValueFactory的时区吗?

时间:2018-07-24 07:45:21

标签: mysql mysql-connector

我有10〜个带有20〜DATETIME个字段的mysql表。并尝试将表从mysql迁移到Google bigquery。

在此过程中,我碰巧使用了mysql-connector-j 8.0.x,据我所知,mysql DATETIME不了解时区。 bigquery的TIMESTAMP将时间戳另存为UTC。

因此,我应该使用时区信息更改mysql DATETIME

我想它将由SqlTimestampValueFactory处理。 我的猜测正确吗?如果是真的,该如何自定义tz中的SqlTimestampValueFactory

1 个答案:

答案 0 :(得分:0)

您可以通过设置serverTimezone属性为SqlTimestampValueFactory自定义tz值。

即使mysql DATETIME datetype没有时区信息也是如此。时区假设由服务器变量time_zone完成。 mysql-connector-j通过TimestampValueFactory通过ServerSession.getDefaultTimezone()处理转换。

因此,在我的情况下,serverTimezone属性设置就足够了。

TL; DR

SqlTimestampValueFactory在ResultSetImpl初始化。

# com.mysql.cj.jdbc.result.ResultSetImpl#ResultSetImpl
this.defaultTimestampValueFactory = 
   decorateDateTimeValueFactory(
      new SqlTimestampValueFactory(
          this.session.getServerSession().getDefaultTimeZone()),
          this.zeroDateTimeBehavior);

NativeProtocol正在初始化defaultTimeZone

String canonicalTimezone = getPropertySet().getStringReadableProperty(PropertyDefinitions.PNAME_serverTimezone).getValue();
...
...
if (canonicalTimezone != null && canonicalTimezone.length() > 0) {
        this.serverSession.setServerTimeZone(TimeZone.getTimeZone(canonicalTimezone));
...