问题描述
在 MySQL 在数据迁移过程中可能会发现数据库迁移后的数据时区不对,这和客户的时间数据定义的字段类型有很大关系,TIMESTAMP 和 DATETIME 两者之间有什么区别?
问题分析
对于 TIMESTAMP,它把客户端插入的时间从当前时区转化为 UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。而对于 DATETIME,会保持原有的时间数值。
问题复现
# timestamp 格式的表格
mysql> create table test(id int, order_createtime timestamp);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test values(1,'20220928080000');
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+------+---------------------+
| id | order_createtime |
+------+---------------------+
| 1 | 2022-09-28 08:00:00 |
+------+---------------------+
1 row in set (0.01 sec)
# 查看当前会话的时区
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)
# 修改会话时区
mysql> set time_zone='+00:00';
Query OK, 0 rows affected (0.00 sec)
# 查看表中的数据,发现时间已经改变
mysql> select * from test;
+------+---------------------+
| id | order_createtime |
+------+---------------------+
| 1 | 2022-09-28 08:00:00 |
+------+---------------------+
1 row in set (0.00 sec)
解决方案
如果是使用 TIMESTAMP 的字段类型记录时间,需要在在迁移过程中注意 time_zone 的环境变量保持一致,time_zone 的数值最好不要设置为 SYSTEM,否则如果源库和目标库的系统时间不一致也会出现查询结果不一致的情况。 如果您有其他问题,欢迎您联系火山引擎技术支持服务