上云无忧 > 文档中心 > 百度智能云云数据库RDS time_zone参数使用详解
云数据库 RDS
百度智能云云数据库RDS time_zone参数使用详解

文档简介:
time_zone参数是MySQL记录时区信息的变量,经常有客户发起对time_zone的修改需求,原因包括但不限于如下几点: 新迁移上云的RDS实例,修改time_zone对齐原数据库实例的时区信息。 由于JDBC时区函数的问题,导致应用程序查看到的时间和实际时间存在若干小时的偏差。 for MySQL 版
*此产品及展示信息均由百度智能云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

背景

time_zone参数是MySQL记录时区信息的变量,经常有客户发起对time_zone的修改需求,原因包括但不限于如下几点:

  • 新迁移上云的RDS实例,修改time_zone对齐原数据库实例的时区信息
  • 由于JDBC时区函数的问题,导致应用程序查看到的时间和实际时间存在若干小时的偏差

问题现象

如下案例,MySQL实际存储的timestamp字段的时间比程序访问看到的时间点差了13个小时:

  • RDS实例参数设置如下:

  • 使用MySQL客户端连接,查看时间数据如下:

  • 使用JDBC访问数据库,查看时间数据如下:

原因分析

当前数据库实例的时区参数time_zone设置取值是system,表示继承系统时区参数system_time_zone的取值CST。由于JDBC负责配置时区的函数对CST时区解析存在混淆,导致应用程序获取的是古巴标准时:

  • CST(China Standard Time)中国标准时,UTC +08:00
  • CST(Cuba Standard Time)古巴标准时,UTC -05:00

解决方案

设置time_zone参数,明确指定数据库实例的时区,不使用引发误解的CST时区。

案例复现

创建测试表

CREATE TABLE tb_01 (
   id int(11) NOT NULL AUTO_INCREMENT,
   dtime datetime NOT NULL,
   stamp timestamp NOT NULL,
   PRIMARY KEY (id)
) ENGINE=InnoDB;

测试过程

设置time_zone并插入数据 设置time_zone并读取数据 输出结果 datetime字段时间差 timestamp字段时间差
set session time_zone='system';
insert into tb_01(id,dtime,stamp)
values(1,'2018-12-24 12:00:00','2018-12-24 12:00:00');
set session time_zone='system'; id=1
dtime='2018-12-24 12:00:00'
stamp='2018-12-24 12:00:00'
不变 不变
set session time_zone='+8:00'; id=1
dtime='2018-12-24 12:00:00'
stamp='2018-12-24 12:00:00'
不变 不变
set session time_zone='-6:00'; id=1
dtime='2018-12-24 12:00:00'
stamp='2018-12-23 22:00:00'
不变 差14小时
set session time_zone='-5:00'; id=1
dtime='2018-12-24 12:00:00'
stamp='2018-12-23 23:00:00'
不变 差13小时
set session time_zone='+9:00'; id=1
dtime='2018-12-24 12:00:00'
stamp='2018-12-24 13:00:00'
不变 差1小时
set session time_zone='-6:00';
insert into tb_01(id,dtime,stamp)
values(2,'2018-12-24 12:00:00','2018-12-24 12:00:00');
set session time_zone='system'; id=2
dtime='2018-12-24 12:00:00'
stamp='2018-12-25 02:00:00'
不变 差14小时
set session time_zone='+8:00'; id=2
dtime='2018-12-24 12:00:00'
stamp='2018-12-25 02:00:00'
不变 差14小时
set session time_zone='-6:00'; id=2
dtime='2018-12-24 12:00:00'
stamp='2018-12-24 12:00:00'
不变 不变
set session time_zone='-5:00'; id=2
dtime='2018-12-24 12:00:00'
stamp='2018-12-24 13:00:00'
不变 差1小时
set session time_zone='+9:00'; id=2
dtime='2018-12-24 12:00:00'
stamp='2018-12-25 03:00:00'
不变 差15小时

总结建议

总结

  • time_zone参数在数据插入和数据读取时的取值需要对齐,否则对于timestamp类型字段会导致时区差异,而datetime类型字段不受影响
  • 数据插入到数据库后,不论如何调整time_zone参数设置,timestamp类型字段的数据内容都不会变化(checksum table结果一致),只是读取显示存在时区偏移
  • 产生以上现象的原因是因为MySQL写入时把timestamp字段按照当前时区设置转换后存储,读取时按照当前时区设置转换后展现。

建议

建议仅在新建RDS实例时对time_zone参数进行修改,在RDS实例使用过程中不建议修改,否则插入和读取的timestamp类型数据由于前后时区设置不一致,会造成数据错乱问题。

相似文档
  • MySQL的InnoDB存储引擎的表存在一系列的限制条件,其中比较常见的一种是表的字段索引长度限制,该限制与参数innodb_large_prefix相关。 问题现象: 执行如下两个建表SQL操作,都返回了报错信息,导致建表失败。 for MySQL 版
  • 在数据库的使用过程中,经常需要进行批量的数据导入操作,MySQL数据库批量数据导入可以使用LOAD DATA命令,实现大批量数据的快速入库需求。 问题现象: 在使用LOAD DATA命令可能会遇到如下报错情况: 使用 LOAD DATA LOCAL INFILE 命令批量导入数据时,报错: ERROR 1148 (42000): The used command is not allowed with this MySQL version. for MySQL 版
  • 百度云支持更改数据库表的大小写设置参数,该参数修改后需要重启实例生效: lower_case_table_names=0,表示区分大小写,创建的库表会原样大小写保存在磁盘上。 lower_case_table_names=1,表示不区分大小写,创建库表时MySQL会将所有的库表名转换成小写字母保存在磁盘上,且SQL语句中涉及到库表无论写成大写或者小写,都会被转化成小写进行查询和写入。 for MySQL 版
  • MySQL中有这样的一个默认行为:一行数据中的某些列被更新了,如果这一行中有timestamp类型的列,那么这个timestamp列会自动更新时间戳。这个行为是由explicit_defaults_for_timestamp参数控制的。在实际使用过程中经常会遇到一些非预期的异常情况,这给数据库使用过程带来诸多不便,本文重点介绍参数explicit_defaults_for_timestamp使用过程中的常见问题和注意事项。 for MySQL 版
  • MySQL数据库可以通过参数sql_mode来控制数据库的行为,本文介绍sql_mode的取值之一:NO_ENGINE_SUBSTITUTION。它的用途是:当CREATE TABLE或ALTER TABLE之类的语句指定一个已禁用或未编译的存储引擎时,控制默认存储引擎的自动替换。 for MySQL 版
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部