MySQL 修改数据库时区为上海时间(UTC+8)
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 | system_time_zone = UTC |
说明:
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 | [mysqld] |
配置详解
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 | [mysqld] |
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
- 云服务器