我有10〜个带有20〜DATETIME
个字段的mysql表。并尝试将表从mysql迁移到Google bigquery。
在此过程中,我碰巧使用了mysql-connector-j 8.0.x,据我所知,mysql DATETIME
不了解时区。 bigquery的TIMESTAMP
将时间戳另存为UTC。
因此,我应该使用时区信息更改mysql DATETIME
。
我想它将由SqlTimestampValueFactory
处理。
我的猜测正确吗?如果是真的,该如何自定义tz
中的SqlTimestampValueFactory
?
答案 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));
...