mysql启动时default_time_zone生效需满足:配置在[mysqld]段、用+08:00格式、未被启动参数覆盖;docker需挂载宿主机时区且确保tzdata存在;set global time_zone不改变default_time_zone且不持久。

MySQL 启动时设置 default_time_zone 生效的前提
直接改配置文件里的 default_time_zone 不一定生效——MySQL 只在启动时读取它,且前提是没被其他机制覆盖。比如你用的是 Docker 官方镜像,或者 systemd 管理的 mysqld,实际启动命令里带了 --default-time-zone 参数,那配置文件里的设置就会被忽略。
常见错误现象:SHOW VARIABLES LIKE 'time_zone'; 返回 SYSTEM,但系统时区是 UTC,而你期望是 +08:00;或者修改后重启,SELECT NOW(); 仍显示 UTC 时间。
- 确认 MySQL 是否真从配置文件加载:执行
SELECT @@GLOBAL.config_file;(5.7+)或检查mysqld --verbose --help | grep "Default options"输出的配置路径 - 配置项必须放在
[mysqld]段下,不是[client]或全局段 - 值推荐用偏移量写法,如
+08:00,避免用Asia/Shanghai——后者依赖系统 tzdata,容器环境常缺失 - 如果用 Docker,别只改
my.cnf,还要确保启动命令没用-e TZ=...或--default-time-zone覆盖
运行时临时修改 default_time_zone 的边界
用 SET GLOBAL time_zone = '+08:00'; 看似能立刻生效,但它只影响新连接的会话默认时区,不改变已存在的连接,也不持久化。更重要的是,它不会改变 default_time_zone 这个系统变量本身——后者只由启动参数或配置文件决定。
使用场景有限:适合调试、临时迁移验证,或配合连接池做会话级覆盖(如某些 ORM 默认发 SET time_zone=...)。
-
SET time_zone修改的是当前会话的time_zone,不是default_time_zone -
SET GLOBAL time_zone需要 SUPER 权限,且重启后丢失 - 对 TIMESTAMP 类型字段的存储/读取行为有直接影响:它控制“无时区时间字面量”如何转成 UTC 存储
- 不要指望它修复已有数据的显示问题——历史数据按旧规则存的,改变量不重算
验证时区是否真正生效的三个关键检查点
光看 SHOW VARIABLES LIKE 'time_zone' 不够,它可能显示 SYSTEM,但背后系统时区未必是你以为的那个。真正要验证的,是数据行为是否符合预期。
- 查
SELECT @@global.time_zone, @@session.time_zone;——两者都应为+08:00(或你设的值),而非SYSTEM - 执行
SELECT NOW(), SYSDATE(), UTC_TIMESTAMP();,对比三者差值是否稳定为 8 小时(若设+08:00) - 建一张含
TIMESTAMP字段的表,插入INSERT INTO t VALUES ('2024-01-01 12:00:00');,再用不同会话(不同time_zone设置)查,观察显示值是否随会话时区变化 —— 这才是TIMESTAMP正确工作的标志
Docker 和云数据库里最常漏掉的一环
很多人在容器里配好了 my.cnf,也确认了 mysqld 启动时加载了它,但 SELECT NOW() 仍是 UTC。问题往往出在容器宿主机的时区没同步,或者 MySQL 容器根本没挂载正确的时区文件。
典型表现:SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP()); 返回 00:00:00,哪怕配置写了 +08:00。
- Docker 启动时加
-v /etc/localtime:/etc/localtime:ro,否则容器内SYSTEM时区指向的是 UTC - Alpine 基础镜像默认没装 tzdata,
Asia/Shanghai会 fallback 到 UTC,必须手动apk add tzdata并cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime - 阿里云 RDS、腾讯云 CDB 等不开放配置文件修改,只能通过控制台或 API 设置参数组,且部分版本不支持动态改
default_time_zone,需重启实例
SYSTEM 的实际含义,以及 TIMESTAMP 和 DATETIME 对时区响应的根本差异。










