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] 段落下添加:
网奇.NET网络商城系统是基于.Net平台开发的免费商城系统。功能强大,操作方便,设置简便。无需任何设置,上传到支持asp.net的主机空间即可使用。系统特色功能:1、同时支持Access和SqlServer数据库;2、支持多语言、多模板3、可定制缺货处理功能4、支持附件销售功能5、支持会员组批发功能6、提供页面设计API函数7、支持预付款功能8、配送价格分地区按数学公式计算9、商品支持多类别,可
-
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+ 统一时区更可靠 - 避免混用:同一张表中不要让部分时间字段受时区影响、部分不受









