Bug #13052存在于 5.0.15 之前的 MySQL 版本中,其中转储文件表示TIMESTAMP服务器时区中的列,但不包含SET TIME_ZONE确保读取转储文件的任何人(或任何后续服务器)理解这一点的命令;如果没有这样的命令,接收服务器会假定任何TIMESTAMP值都位于其默认时区。
因此,时区偏移 18:30 的服务器之间的传输(例如从南澳大利亚到加利福尼亚)将导致您观察到的行为。
此问题的解决方案(按照一些模糊的优先顺序)包括:
将原始服务器上的 mysqldump 版本升级到 5.0.15 或更高版本(将导致转储文件TIMESTAMP以 UTC 形式表达所有值,并SET TIME_ZONE在开头有合适的语句);
在导出(或导入)之前,更改time_zone源(或目标)服务器上的全局变量,以便它与导入(或导出)时其他服务器上的设置匹配:
SET GLOBAL time_zone = 'America/Los_Angeles'; -- ('Australia/Adelaide')
Run Code Online (Sandbox Code Playgroud)UPDATE事后数据,应用MySQL的CONVERT_TZ()功能:
UPDATE my_table
SET my_column = CONVERT_TZ(
my_column,
'America/Los_Angeles',
'Australia/Adelaide'
);
Run Code Online (Sandbox Code Playgroud)如果使用解决方案 2 或解决方案 3,请注意使用相关服务器变量的确切time_zone时区,以包含任何夏令时。但是,请注意,如MySQL 服务器时区支持下所述:“只有在 mysql 数据库中的时区信息表已创建并填充时,才能使用命名时区。 ”本文继续解释如何创建和填充时区信息表。