一、如何设置 MySQL 时区

1. 查看时区命令

在MySQL中,设置时区涉及到全局时区、会话时区等不同层次的设置,以下是一些关键的命令:

  1. 查看时区信息 SHOW VARIABLES LIKE '%time_zone%'; 结果中的 time_zone 表示当前的时区,而 system_time_zone 是 MySQL 服务启动时读取的操作系统时区。 另一种方式是使用: SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;
  2. 设置会话时区 SET time_zone='+8:00'; 这只在当前会话中生效,不需要重新登录,关闭窗口后设置失效。
  3. 设置全局时区 SET GLOBAL time_zone='+8:00'; 这对整个 MySQL 服务生效,需要重新连接MySQL服务才会生效,而不需要重启服务。
  4. 修改 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 数据库的时区设置。