最近在使用Docker下的MySQL的时候,遇到一个问题,就是发现它的时区不对(因为之前都是习惯了+800的),在做一个SQL查询的时候,发现时区并不是东八区(CST即China Standard Time),例如:
select * from t_test where create_date>now()
本来类似这样的记录是能查出来的,但是现在却没有,进一步调试,发现select now()出来的时间比北京时间少了8个小时。
如何在Docker下安装MySQL的文章,请查看:https://blog.terrynow.com/2022/04/19/docker-install-mysql-server-simple-steps-and-some-common-operations-remarks/
问题解决
我们进去SQL看下,MySQL的时区,显示的是UTC,而不是CST:
show variables like '%time_zone%' +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | UTC | | time_zone | SYSTEM | +------------------+--------+ 2 rows in set (0.00 sec)
以上问题很容易看出来是时区问题,原因是docker容器里的的时间是没有时区的,
解决方案1
我们通过给docker容器的时间修改时区来解决
# containerId是容器ID,通过docker ps可查看到 # 进入容器命令行 docker exec -it <containerId> bash # 查看时间(发现时间比北京时间满了8个小时) date # Tue Jun 7 00:00:48 UTC 2022 (我查询的时候是8点) # 修改时区 ln -sf /usr/share/zoneinfo/Asia/Singapore /etc/localtime # 退出容器命令行 exit # 重启mysql容器 docker restart <containerId>
现在再使用SQL指令查下select now()应该就正常了,再来确认下:
show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | +08 | | time_zone | SYSTEM | +------------------+--------+ 2 rows in set (0.00 sec) select now(); now() 2022-06-07 08:08:06
解决方案2
修改mysql配置文件,指定时区
# containerId是容器ID,通过docker ps可查看到
# 进入容器命令行
docker exec -it <containerId> bash
# vi /etc/my.cnf
# [mysqld] 下增加如下一行:
default-time-zone='+08:00'
# 退出容器命令行
exit
# 重启mysql容器
docker restart <containerId>
文章评论