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