mysql_tzinfo_to_sql命令执行后时区表为空是因为它只生成sql输出而不自动导入,需通过管道导入:mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql;windows用户须下载官方时区包手动导入。

为什么 mysql_tzinfo_to_sql 命令执行后时区表仍是空的?
直接运行 mysql_tzinfo_to_sql 不会自动写入数据库,它只生成 SQL 语句输出,默认打印到终端。你得手动把输出导入 MySQL,否则 mysql.time_zone 等表自然为空。
- 正确做法是管道导入:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql - 路径
/usr/share/zoneinfo是 Linux 常见位置;macOS 用/usr/share/zoneinfo(Homebrew 安装的 MySQL 可能需先brew install tzdata并指定路径) - Windows 用户不能用该命令——MySQL for Windows 不附带 zoneinfo 文件,必须从 MySQL 官网下载预编译时区表 ZIP 包,解压后用
mysql -u root -p mysql 导入
导入后 SELECT NOW() 还是显示 UTC 时间?
加载时区数据只是准备了映射表,不改变当前会话或全局时区设置。MySQL 默认使用系统时区(通常为 UTC),除非显式设置。
- 查看当前会话时区:
SELECT @@session.time_zone(常见返回SYSTEM或+00:00) - 临时切换会话时区:
SET time_zone = 'Asia/Shanghai',之后NOW()才反映本地时间 - 永久生效需改配置文件:在
my.cnf的[mysqld]段落加default-time-zone='Asia/Shanghai',重启 MySQL - 注意:
default-time-zone不支持SYSTEM值,必须填具体时区名或偏移量(如+08:00)
执行 mysql_tzinfo_to_sql 报错 “Unknown system variable 'time_zone_name'”?
这是 MySQL 5.7+ 版本兼容性问题:旧版脚本试图读取已废弃的系统变量,但不影响实际导入结果。只要最终 mysql.time_zone 表有数据(SELECT COUNT(*) FROM mysql.time_zone > 0),就可忽略该警告。
- 更稳妥的做法是跳过校验:加
--skip-symbolic-links参数(部分版本需要) - 确认导入是否成功,别依赖命令退出码——重点查表内容:
SELECT name FROM mysql.time_zone_name LIMIT 5 - 如果表仍为空,检查 MySQL 用户是否有
mysql库的 INSERT 权限:GRANT INSERT ON mysql.* TO 'root'@'localhost'
时区数据更新后应用不生效?
MySQL 启动时会缓存时区信息,即使表已更新,旧连接仍用启动时加载的缓存。这不是 bug,是设计行为。
- 运行
FLUSH TIME ZONES强制重新加载(MySQL 5.7.10+ 支持) - 低版本只能重启 MySQL 服务
- 注意:该命令不会刷新当前会话的时区值,已建立的连接仍保持原
time_zone设置,新连接才用最新规则 - 夏令时变更(如欧盟政策调整)后,必须重新导入新版 zoneinfo 并执行
FLUSH TIME ZONES,否则历史时间计算可能出错
时区不是“导入一次就一劳永逸”的配置,尤其涉及跨年时间计算或部署在多时区服务器时,FLUSH TIME ZONES 和定期核对 mysql.time_zone_transition 表的有效性,比第一次导入更关键。











