mysql时区需通过my.cnf配置default-time-zone='+08:00'并重启服务才能永久生效;仅set global time_zone为临时操作且权限受限;验证需查@@global.time_zone、@@session.time_zone及timediff(now(),utc_timestamp)。

确认当前时区是否真为 SYSTEM 或 UTC
很多问题不是“没设”,而是设了但没生效,或者误以为已生效。先连上 MySQL 执行:SELECT @@global.time_zone, @@session.time_zone;。如果返回 SYSTEM,说明 MySQL 正在跟随系统时区;若返回 +00:00 或 UTC,那 NOW() 实际输出的就是 UTC 时间——比北京时间慢 8 小时。
再补查一句:SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);。理想结果应是 08:00:00;如果返回 00:00:00,说明时区根本没切过来,default-time-zone 没生效或压根没配。
永久生效必须改 my.cnf / my.ini 的 [mysqld] 段
default-time-zone 是唯一能保证服务重启后仍为 +08:00 的配置项,它作用于全局且优先级高于系统时区。临时 SET 不写入配置文件,重启即丢。
- Linux 通常为
/etc/my.cnf或/etc/mysql/my.cnf;Windows 多为C:\ProgramData\MySQL\MySQL Server 8.0\my.ini - 在
[mysqld]下新增一行:default-time-zone = '+08:00' - 注意:
default-time-zone不能写成time-zone或timezone;值必须带引号、用+08:00格式(不要写+8:00或CST) - 修改后必须重启服务:
systemctl restart mysqld(Linux)或通过服务管理器重启(Windows)
SET GLOBAL time_zone 只影响新连接,且权限受限
执行 SET GLOBAL time_zone = '+08:00'; 后,现有连接的 @@session.time_zone 不变,只有后续新建连接才会继承这个全局值。它适合紧急测试,但不可替代配置文件。
常见报错:ERROR 1227 (42501): Access denied; you need (at least one of) the SYSTEM_VARIABLES_ADMIN privilege(s) for this operation。这意味着当前用户没有足够权限——普通应用账号几乎都不该有此权限,别硬加,直接走配置文件更安全。
使用 'Asia/Shanghai' 命名时区需额外加载时区表
如果想用 'Asia/Shanghai' 而不是偏移量,必须确保 MySQL 的时区表已加载,否则启动会失败或 fallback 到 SYSTEM。
- 运行命令填充时区数据:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql - 该命令将系统时区信息导入
mysql数据库中,依赖操作系统已安装完整 zoneinfo - 配置文件中可写:
default-time-zone = 'Asia/Shanghai',但仅当上述导入成功后才可靠 - 不推荐生产环境用命名时区:不同系统对
Asia/Shanghai解析可能不一致,+08:00更稳定
真正容易被忽略的是:即使配置文件写了 default-time-zone,如果 MySQL 启动时读取的是错误路径的配置文件(比如存在多个 my.cnf),或者服务未真正重启(只是 reload 而非 restart),设置都不会生效。务必用 ps aux | grep mysqld 看进程启动参数,确认实际加载的配置路径。











