某考勤系統部署於全球多個 AP 節點,業務要求所有時間統一按 UTC+8(東八區) 計算。因此必須在 MySQL 伺服器層面固定時區,避免應用層轉換帶來的不一致風險。
環境: RHEL 5.5 / MySQL 5.5.40
mysql> SHOW VARIABLES LIKE '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | CST | | time_zone | SYSTEM | +------------------+--------+
system_time_zone:作業系統層面的時區(此處 CST 可能指 China Standard Time 或 Central Standard Time,易混淆)。time_zone:MySQL 實例當前使用的時區,SYSTEM 表示跟隨作業系統。my.cnf(永久生效,需重啟)[mysqld] default-time-zone='+08:00'
保存後執行 service mysqld restart 或 systemctl restart mysqld。
mysql> SET GLOBAL time_zone = '+08:00'; -- 需 SUPER 權限,影響新連線 mysql> SET time_zone = '+08:00'; -- 僅影響當前會話
mysql> SHOW VARIABLES LIKE '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | CST | | time_zone | +08:00 | +------------------+--------+ mysql> SELECT NOW(); +---------------------+ | NOW() | +---------------------+ | 2011-18-21 18:39:07 | +---------------------+
此時 NOW()、CURTIME() 等時間函數均會按 +08:00 輸出。
+08:00 這類具體偏移量,而非 Asia/Shanghai 等命名時區,可避免系統時區資料庫缺失或版本差異導致的解析錯誤。SYSTEM,修改後 system_time_zone 仍顯示 CST,屬正常現象,以 time_zone 為準。