MySQL 默认使用系统时区,但实际开发中常需统一为 UTC+8(如北京时间),否则时间字段(如
NOW()、
CURRENT_TIMESTAMP)可能与业务预期不符。关键在于区分全局时区和会话时区,并确保服务重启后仍生效。
查看当前 MySQL 时区设置
连接 MySQL 后执行:
SELECT @@global.time_zone, @@session.time_zone;
常见返回:
SYSTEM表示跟随系统时区;
+00:00或
UTC表示 UTC;
+08:00表示东八区。
也可查系统时区确认基准:
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
临时修改(重启失效)
仅对当前会话或全局生效,适合测试:
修改当前会话时区:SET time_zone = '+08:00';修改全局时区(影响新连接):
SET GLOBAL time_zone = '+08:00';
⚠️ 注意:普通用户需
SYSTEM_VARIABLES_ADMIN权限;修改后已有连接不受影响。
永久配置(推荐)
编辑 MySQL 配置文件(通常是
/etc/my.cnf或
/etc/mysql/mysql.conf.d/mysqld.cnf),在
[mysqld]段下添加:
[mysqld] default-time-zone = '+08:00'
保存后重启 MySQL 服务:
Linux(systemd):sudo systemctl restart mysql或
sudo systemctl restart mysqldmacOS(Homebrew):
brew services restart mysql
重启后执行
SELECT @@global.time_zone;应返回
+08:00。
补充说明:避免时区混乱的要点
MySQL 的
TIMESTAMP类型会自动按当前时区转换存储/读取,而
DATETIME不做转换——存什么读什么。因此: 若业务依赖本地时间显示,建议统一设为
+08:00并用
TIMESTAMP若需跨时区精确记录原始时间(如日志),建议用
DATETIME+ 应用层统一转 UTC 存储 JDBC 连接 URL 中可显式指定时区,如:
?serverTimezone=Asia/Shanghai,避免驱动误判
不复杂但容易忽略。
