MariaDB/MySQL设置时区后日期时间显示异常配置不生效
MySQL/MariaDB 配置时区后时间显示异常排查修复
按以下步骤逐一排查即可解决问题:
- 第一步:先确认时区实际生效状态
登录数据库执行如下SQL,查看当前三层时区参数的实际值,不要仅凭配置文件判断配置是否生效:SELECT @@global.time_zone, @@session.time_zone, @@system_time_zone;若
@@global.time_zone返回值为SYSTEM,代表数据库未加载你手动配置的时区,当前直接复用宿主机系统时区。 - 第二步:修复配置不生效的常见问题
- 配置写入位置错误
时区参数必须写在数据库配置文件(通常路径为/etc/my.cnf或/etc/mysql/my.cnf)的[mysqld]配置段下才会对服务端生效,写在[client]等其他配置段不会产生任何作用。正确配置示例:
修改配置后必须执行服务重启命令加载新配置,根据你安装的数据库类型选择对应命令:[mysqld] default-time-zone = '+08:00' # 也可写地理时区名:default-time-zone = 'Asia/Shanghai'# MariaDB systemctl restart mariadb # MySQL systemctl restart mysqld - 地理时区名识别失败
如果你使用Asia/Shanghai这类地理时区名而非UTC偏移值配置,需要先将系统时区数据导入数据库内置的mysql系统库,否则数据库无法识别对应时区名,会自动回退到SYSTEM时区。导入操作在操作系统shell层执行即可:
执行时输入数据库root密码,导入完成后重启数据库服务即可。mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql - 连接层会话时区覆盖全局配置
多数数据库客户端、JDBC等连接驱动会在连接建立时自动执行时区设置语句,覆盖全局时区配置。这类场景需要在连接参数中强制指定正确时区,比如JDBC连接串需要追加serverTimezone=Asia/Shanghai参数,避免驱动自动修改会话时区。
- 配置写入位置错误
- 第三步:存量数据注意事项
配置生效后执行SELECT NOW();,如果返回值和预期时间一致代表服务端时区配置正常。需要注意:TIMESTAMP类型的存量数据会自动根据当前会话时区转换显示,无需额外修改;DATETIME类型存储的是固定字面时间值,不会随时区配置自动调整,如果是在错误时区下写入的存量DATETIME数据,需要手动写SQL做时间偏移更新,不会随配置修改自动更正。
内容的提问来源于stack exchange,提问作者Chris FERREIRA
相关产品推荐
相关产品推荐

