MySQL需统一设为UTC+8时区,须同时配置全局default-time-zone='+08:00'并重启服务,以及会话级SET time_zone='+08:00';TIMESTAMP受时区影响而DATETIME不受。

MySQL 默认使用系统时区,但实际开发中常需统一为 UTC+8(如北京时间),否则时间字段(如 NOW()、CURRENT_TIMESTAMP)或 TIMESTAMP 类型存储/查询结果会出错。配置需从服务端全局和客户端会话两个层面入手,缺一不可。
查看当前 MySQL 时区设置
连接 MySQL 后执行以下命令,确认当前生效的时区:
-
SELECT @@global.time_zone, @@session.time_zone;—— 分别显示全局和服务端默认时区 -
SELECT NOW(), UTC_TIME(), SYSDATE();—— 对比本地时间、UTC 时间与系统时间,辅助判断偏差 -
SHOW VARIABLES LIKE '%time_zone%';—— 查看所有相关变量
永久修改 MySQL 全局时区(推荐 UTC+8)
修改配置文件(如 /etc/my.cnf 或 /etc/mysql/my.cnf),在 [mysqld] 段落下添加:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
default-time-zone = '+08:00'—— 推荐用偏移量写法,避免依赖系统时区名(如 'Asia/Shanghai' 可能因系统未安装 tzdata 而失败) - 保存后重启 MySQL:
sudo systemctl restart mysql(或mysqld) - 重启后执行
SELECT @@global.time_zone;应返回+08:00
为现有连接临时设置会话时区
若无法重启服务,或需为特定应用单独指定,可在连接后立即执行:
-
SET time_zone = '+08:00';—— 仅对当前会话有效 -
SET GLOBAL time_zone = '+08:00';—— 修改全局值(需 SUPER 权限,且重启后失效) - 应用代码中(如 Python 的 pymysql、Java 的 JDBC),建议在建立连接后主动执行该语句,确保时间函数行为一致
注意 TIMESTAMP 与 DATETIME 的区别
时区设置主要影响 TIMESTAMP 类型:它存的是 UTC 时间,读取时自动转为当前会话时区;而 DATETIME 始终按字面值存储和返回,与时区无关。
- 若业务强依赖本地时间显示(如日志时间),用
DATETIME更直观 - 若需跨时区统一时间基准(如订单创建时间),用
TIMESTAMP+ 统一时区更可靠 - 避免混用:同一张表中不要让部分时间字段受时区影响、部分不受

















