MySQL需统一设为UTC+8时区,须同时配置全局default-time-zone='+08:00'并重启服务,以及会话级SET time_zone='+08:00';TIMESTAMP受时区影响而DATETIME不受。
MySQL 默认使用系统时区,但实际开发中常需统一为 UTC+8(如北京时间),否则时间字段(如 NOW()、CURRENT_TIMESTAMP)或 TIMESTAMP 类型存储/查询结果会出错。配置需从服务端全局和客户端会话两个层面入手,缺一不可。
连接 MySQL 后执行以下命令,确认当前生效的时区:
SELECT @@global.time_zone, @@session.time_zone; —— 分别显示全局和服务端默认时区SELECT NOW(), UTC_TIME(), SYSDATE(); —— 对比本地时间、UTC 时间与系统时间,辅助判断偏差SHOW VARIABLES LIKE '%time_zone%'; —— 查看所有相关变量修改配置文件(如 /etc/my.cnf 或 /etc/mysql/my.cnf),在 [mysqld] 段落下添加:
default-time-zone = '+08:00' —— 推荐
sudo systemctl restart mysql(或 mysqld)SELECT @@global.time_zone; 应返回 +08:00
若无法重启服务,或需为特定应用单独指定,可在连接后立即执行:
SET time_zone = '+08:00'; —— 仅对当前会话有效SET GLOBAL time_zone = '+08:00'; —— 修改全局值(需 SUPER 权限,且重启后失效)时区设置主要影响 TIMESTAMP 类型:它存的是 UTC 时间,读取时自动转为当前会话时区;而 DATETIME 始终按字面值存储和返回,与时区无关。
DATETIME 更直观TIMESTAMP + 统一时区更可靠