MySQL 修改数据库时区为上海时间(UTC+8)
wxk1991 Lv3

MySQL 修改数据库时区为上海时间(UTC+8)

很多人在部署:

  • Vue 项目
  • Java 后端
  • Node.js
  • SpringBoot
  • PHP 网站

时,会发现:

1
数据库时间不对

例如:

  • 少了 8 小时
  • 时间变成 UTC
  • 创建时间异常
  • 日志时间错误

原因通常:

1
MySQL 默认使用 UTC 时区

本篇文章教你:

  • 如何修改 MySQL 时区
  • 设置为上海时间
  • Ubuntu 修改数据库时区
  • MySQL 8 设置 UTC+8
  • 日志时间同步

为什么 MySQL 时间会少 8 小时?

因为:

1
MySQL 默认可能使用 UTC

而中国时间:

1
UTC +8

所以:

1
会少 8 小时

例如:

UTC 上海时间
12:00 20:00

查看当前 MySQL 时区

进入 MySQL:

1
mysql -u root -p

执行:

1
SHOW VARIABLES LIKE '%time_zone%';

例如:

1
2
system_time_zone = UTC
time_zone = SYSTEM

说明:

1
当前还是 UTC

一、修改 MySQL 配置文件

Ubuntu 通常配置文件位置:

1
/etc/mysql/mysql.conf.d/mysqld.cnf

编辑:

1
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

二、在 [mysqld] 中加入配置

找到:

1
[mysqld]

加入:

1
2
3
4
5
[mysqld]

default_time_zone = '+8:00'

log_timestamps = SYSTEM

配置详解


default_time_zone

1
default_time_zone = '+8:00'

作用:

1
设置 MySQL 默认时区为东八区

即:

1
中国上海时间

log_timestamps

1
log_timestamps = SYSTEM

作用:

1
让日志时间也使用系统时间

包括:

  • error log
  • slow log
  • general log

是否可以写 Asia/Shanghai?

可以。

例如:

1
default_time_zone = 'Asia/Shanghai'

但:

1
部分系统可能没有时区表

所以:

1
推荐 '+8:00'

更稳定。


三、重启 MySQL

修改后:

执行:

1
sudo systemctl restart mysql

四、验证是否生效

重新进入 MySQL:

1
mysql -u root -p

执行:

1
SHOW VARIABLES LIKE '%time_zone%';

现在应该看到:

1
+8:00

说明:

1
修改成功

五、查看当前数据库时间

执行:

1
SELECT NOW();

如果:

1
显示中国时间

说明:

1
已经正常

六、同步 Ubuntu 系统时区(推荐)

很多时候:

1
MySQL 时间错误

其实:

1
是 Linux 系统时区错误

查看系统时间

执行:

1
timedatectl

例如:

1
Time zone: UTC

说明:

1
系统还是 UTC

修改 Ubuntu 为上海时区

执行:

1
sudo timedatectl set-timezone Asia/Shanghai

再次查看

执行:

1
timedatectl

现在应该看到:

1
Asia/Shanghai

七、推荐生产环境方案

推荐:

项目 建议
Ubuntu 时区 Asia/Shanghai
MySQL 时区 +8:00
日志时间 SYSTEM
Docker 同步宿主机时区

Docker 用户特别注意

很多 Docker 容器:

1
默认也是 UTC

建议:

1
-v /etc/localtime:/etc/localtime:ro

同步宿主机时间。


八、Java / SpringBoot 特别注意

很多 Java 项目:

1
即使 MySQL 正确

时间仍然:

1
会错误

因为:

1
JDBC 默认 UTC

JDBC 推荐配置

例如:

1
serverTimezone=Asia/Shanghai

完整示例:

1
jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai

九、Node.js 用户注意

Node.js 建议:

1
统一使用 UTC 存储

前端再:

1
转本地时间

但:

1
国内项目一般直接用 +8

更方便。


十、常见问题

1. 修改后没生效

原因:

  • 忘记重启 MySQL
  • 配置写错
  • 写到了错误配置文件

2. Unknown or incorrect time zone

说明:

1
系统没有时区表

建议:

1
直接使用 +8:00

最稳定。


3. Docker 时间不对

原因:

1
容器还是 UTC

需要:

1
同步宿主机时间

十一、推荐配置(最终版)

推荐:

1
2
3
4
5
[mysqld]

default_time_zone = '+8:00'

log_timestamps = SYSTEM

Ubuntu:

1
sudo timedatectl set-timezone Asia/Shanghai

这样:

1
系统时间 + 数据库时间

都会统一。


总结

MySQL 时间错误:

1
90% 都是时区问题

推荐:

配置 推荐
Ubuntu Asia/Shanghai
MySQL +8:00
JDBC serverTimezone
Docker 同步宿主机时间

核心配置:

1
default_time_zone = '+8:00'

然后:

1
sudo systemctl restart mysql

即可。

非常适合:

  • Ubuntu
  • Vue + Java
  • SpringBoot
  • Node.js
  • Docker
  • 云服务器