如何配置mysql时区_mysql时区设置方法

来源:这里教程网 时间:2026-02-28 20:44:59 作者:

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]
段落下添加:

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
+ 统一时区更可靠
避免混用:同一张表中不要让部分时间字段受时区影响、部分不受

相关推荐