Mysql时区问题

Posted by Wh0ami-hy on January 12, 2024

1. log_timestamps参数

log_timestamps参数并不影响时区,只会影响某些日志记录的时间。该参数主要是控制 error log、slow log、genera log 日志文件中的显示时间。log_timestamps 该参数全局有效,可以被设置的值有:UTC 和 SYSTEM。默认使用 UTC这样会使得日志中记录的时间比北京时间慢 8 个小时,导致查看日志不方便。可以修改为 SYSTEM 变成使用系统时区

-- 查看参数值
show global variables like 'log_timestamps';
-- 修改参数值
set global log_timestamps = SYSTEM;

2. time_zone参数

time_zone参数用来设置每个连接会话的时区,该参数分为全局和会话级别,可以动态修改。默认值为 SYSTEM,此时使用的是全局参数 system_time_zone 的值,而 system_time_zone 默认继承自当前系统的时区,即默认情况下 MySQL 时区和系统时区相同。

时区设置主要影响时区敏感的时间值的显示和存储。包括一些函数(now()、curtime())显示的值,以及存储在 TIMESTAMP 类型中的值,但不影响 DATE、TIME 和 DATETIME 列中的值,因为这些数据类型在存取时未进行时区转换,而 TIMESTAMP 类型存入数据库的实际是 UTC 的时间,查询显示时会根据具体的时区来显示不同的时间。

-- 查看MySQL当前时区
show global variables like '%time_zone%';
-- 修改时区
set global time_zone='+8:00';

如果需要永久生效,还需写入配置文件中。例如将时区改为东八区,则需要在配置文件中增加一行default_time_zone = '+8:00'

3. 如何避免出现时区问题

  • 首先保证系统时区准确。
  • jdbc 连接串中指定时区,并与数据库时区一致。
  • time_zone 参数建议设置为’+8:00’,不使用容易误解的 CST。
  • 各环境数据库实例时区参数保持相同。

本站总访问量