一、如何设置 MySQL 时区
1. 查看时区命令
在MySQL中,设置时区涉及到全局时区、会话时区等不同层次的设置,以下是一些关键的命令:
- 查看时区信息
SHOW VARIABLES LIKE '%time_zone%';
结果中的time_zone
表示当前的时区,而system_time_zone
是 MySQL 服务启动时读取的操作系统时区。 另一种方式是使用:SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;
- 设置会话时区
SET time_zone='+8:00';
这只在当前会话中生效,不需要重新登录,关闭窗口后设置失效。 - 设置全局时区
SET GLOBAL time_zone='+8:00';
这对整个 MySQL 服务生效,需要重新连接MySQL服务才会生效,而不需要重启服务。 - 修改 MySQL 配置文件永久设置时区
在 MySQL 配置文件(通常是my.cnf
)的[mysqld]
段中添加:[mysqld] default-time-zone=+08:00
需要重启 MySQL 服务后才会生效。
2. 查看并解读命令结果
执行 SHOW VARIABLES LIKE '%time_zone%';
命令会返回两行记录,其中 time_zone
的值表示当前时区。建议修改时区时只关注 time_zone
,忽略 system_time_zone
。
- 如果
time_zone
值是SYSTEM
,表示与system_time_zone
保持一致。 - 不建议将
time_zone
设置成SYSTEM
,因为可能导致与 Java 时间处理的不一致。
3. 探讨一个问题
在更改操作系统时区后,MySQL 的 time_zone
是否会随之变化?
实测结果表明,time_zone
的值实际上是跟随 system_time_zone
变量的变化而变化,而不是操作系统的变化。
二、恶心的CST(修改time_zone改成非SYSTEM!)
CST 是一个容易混淆的时区概念,因为它可能代表不同的时区,如美国标准时间、澳大利亚标准时间、中国标准时间和古巴标准时间。
在 MySQL 中,CST 被解释为 China Standard Time(GMT+8),但在 Java 中,它被解释为 Central Standard Time (USA)(GMT-6)。这可能导致一些 bug。
解决办法:
- 将 MySQL 的
time_zone
设置为非SYSTEM
,例如+08:00
。 - 在程序连接 MySQL 时,jdbcUrl 中带上时区信息,例如
jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai
。
以上是关于 MySQL 时区设置的一些建议和注意事项,希望能帮助您更好地管理 MySQL 数据库的时区设置。