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

8次阅读

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

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

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 的 pymysqljava 的 JDBC),建议在建立连接后主动执行该语句,确保时间函数行为一致

注意 TIMESTAMP 与 DATETIME 的区别

时区设置主要影响 TIMESTAMP 类型:它存的是 UTC 时间,读取时自动转为当前会话时区;而 DATETIME 始终按字面值存储和返回,与时区无关。

  • 若业务强依赖本地时间显示(如日志时间),用 DATETIME 更直观
  • 若需跨时区统一时间基准(如订单创建时间),用 TIMESTAMP + 统一时区更可靠
  • 避免混用:同一张表中不要让部分时间字段受时区影响、部分不受
text=ZqhQzanResources