MySQL日期插入错误及服务器时区时间异常问题咨询
MySQL时区与时间相关问题解答
咱们一个一个拆解你的问题,这些问题核心都围绕MySQL的时区配置和系统时间准确性展开:
1. 为何MySQL插入的日期不正确?
这是个很常见的问题,主要原因通常集中在以下几点:
- 时区不匹配:MySQL有全局时区、会话时区,还有客户端时区。比如你用客户端插入数据时,客户端时区和服务器时区不一致,
TIMESTAMP类型会自动转成UTC存储,查询时再转成当前会话时区,一旦时区设置不对,就会出现日期偏差;而DATETIME是原样存储,如果你插入时用的是客户端时区的时间,服务器时区不同的话,查询出来就会不对。 - 日期格式错误:插入时没有用MySQL认可的日期格式(比如
YYYY-MM-DD HH:MM:SS),导致MySQL自动解析出错,存储了错误的日期。 - 字段类型选错:比如你需要存储带时区的时间却用了
DATETIME,或者反过来;TIMESTAMP有范围限制('1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC),超出范围也会存储错误。 - 系统时间不准:MySQL的时间依赖于服务器的系统时间,如果服务器本身时间就错了,插入的自然也是错误日期。
2. 服务器本地时间+4时区,CURRENT_TIMESTAMP()返回非UTC时间的问题
该时间属于什么时区?
首先,CURRENT_TIMESTAMP()返回的是MySQL服务器当前时区下的系统时间。你服务器本地是+4时区(17:20),对应的UTC时间应该是13:20左右,但返回的是13:33:36且确认不是UTC时间,那大概率是以下两种情况:
- MySQL的全局/会话时区设置不是UTC,而是一个接近UTC但有偏差的时区(这种情况很少见),或者服务器系统时间本身就和真实UTC时间有13分钟的偏差;
- 你可以直接用查询确认当前时区:
同时对比服务器系统时间和真实UTC时间,就能明确问题所在。SELECT @@global.time_zone AS global_timezone, @@session.time_zone AS session_timezone;
如何将服务器时间设置为UTC时区?
分临时生效和永久生效两种方式:
- 临时设置(重启MySQL后失效):
- 全局级别(所有新会话生效):
SET GLOBAL time_zone = '+00:00'; - 会话级别(仅当前连接生效):
SET time_zone = '+00:00';
- 全局级别(所有新会话生效):
- 永久设置(需重启MySQL):
- Linux系统:编辑MySQL配置文件
/etc/my.cnf或/etc/mysql/my.cnf,在[mysqld]段添加:default-time-zone = '+00:00' - Windows系统:编辑
my.ini文件,同样在[mysqld]下添加上述配置,然后重启MySQL服务。
- Linux系统:编辑MySQL配置文件
3. 为何真实UTC是13:25,CURRENT_TIME()返回13:40:19?
这个问题的核心原因无非两个:
- MySQL服务器系统时间不准确:MySQL的所有时间函数(包括
CURRENT_TIME())都是基于服务器的系统时间运行的,如果服务器本身的系统时间比真实UTC快了15分钟,那返回的时间自然会是13:40; - 时区配置错误:如果MySQL的全局或会话时区不是UTC,而是设置成了
UTC+00:15这种偏移时区,那即使真实UTC是13:25,MySQL也会返回13:40的时间。
你可以先执行SELECT NOW(), @@global.time_zone, @@session.time_zone;,对比返回的时间和真实UTC时间,再结合服务器系统时间,就能定位具体是哪出问题了。
内容的提问来源于stack exchange,提问作者user3573738
相关产品推荐
相关产品推荐

