2016-04-28 15:46:19.0|分类: mysql|浏览量: 5072
今天遇到一个奇葩问题, 使用命令导出数据:mysqldump -uhnc -p --default-character-set=utf8 --skip-tz-utc db --ignore-table=hnc.item_data > db201604281349.sql 。把这个 db201604281349.sql文件导入到win10系统的mysql数据库中,发现时间不对,时间怎么都是凌晨呢??我们系统凌晨很少有人操作。 update_at字段类型是timestamp,经过对比发现时间相差8个小时,程序的业务显示时间对,数据库之间比业务时间少8个小时。这是为什么呢?? 第一想法 难道是系统的时区设置的不对? hwclock -r -D查看硬件时间,发现时间确实不对 作系统的时间 通过比较diff比较时区文件确实是上海时区 diff /etc/localtime /usr/share/zoneinfo/Asia/Shanghai 那为什么系统时间和硬件的时间不一样呢?? 使用UTC(对linux就是 /etc/sysconfig/clock 中 UTC=true) 本地时间:由于处在不同的时区,本地时间一般与UTC是不同的,换算方法就是 本地时间 = UTC + 时区 或 UTC = 本地时间 - 时区 时区东为正,西为负,例如在中国,本地时间都使用北京时间,在linux上显示就是 CST(China Standard Time,中国标准时,注意美国的中部标准时Central Standard Time也缩写为CST,与这里的CST不是一回事!),时区为东八区,也就是 +8 区,所以 CST=UTC+(+8小时) 或 UTC=CST-(+8小时)。 第二想法mysql存储的数据对,导出的时候不知道什么原因数据少了8小时? timestamp字段类型,从大小上你可以看出来,它不是个字符串,实际上是一个整型。当我们读取时间的时候2016-04-28 12:14:52,需要将其转换为整型。这就涉及到转换规则。也就是说,对于相同的时间戳,在不同的时区显示的结果是不一样的。反过来也一样,相同的字符串,在不同的时区解释下,会得到不同的时间戳。 mysqldump结构文件 db201604281349.sql 中,我们可以看到/*!40103 SET TIME_ZONE='+00:00' */; 字样,说明mysqldump在默认情况下,是按’+00:00’(中时区). 查看mysql客户端的时间时区,默认的是系统时间 操作系统的时间是东八区 所以数据导出的数据时间少8个小时!! --skip-tz-utc解决这个问题 mysqldump -uhnc -p --default-character-set=utf8 --skip-tz-utc db --ignore-table=hnc.item_data > db201604281349.sql。这样就不会自动转换到了’+00:00’(中时区). mysql默认转成’+00:00’(中时区) ,实际上是因为要防止跨时区导数据。假设你把中国一个机器上的数据导入到美国的一个mysqld,若不显式地设置一个时区,在导入时就会出错了。因为都用系统默认的时区,相同的字符串值会得到不同的时间戳。如我们前面说的, 时间戳是以整型方式存储的。 hwclock参数: --adjust hwclock每次更改硬件时钟时,都会记录在/etc/adjtime文件中。使用--adjust参数,可使hwclock根据先前的记录来估算硬件时钟的偏差,并用来校正目前的硬件时钟。 关于时间、时区、系统时间和硬件时间 格林威治标准时间 GMT 世界协调时间 UTC 夏日节约时间DST 系统时间 硬件时间 世界时间 地方时间 |