如何正确设置mysql时区

Posted

技术标签:

【中文标题】如何正确设置mysql时区【英文标题】:How to correctly set mysql timezone 【发布时间】:2012-01-16 01:39:21 【问题描述】:

我有一个关于 mysql 时区的奇怪问题。

在我的网站配置文件中,我有这行设置时区:

mysql_query("SET SESSION time_zone = '$offset';"); // Offset is properly calculated, no worries about that

有趣的是,如果我像这样在此之后添加另一行:

$q = mysql_query("SELECT NOW() as now");
$row = mysql_fetch_array($row);
echo $row["now"];

执行该代码后,时间显示正确。

但是,在其他一些查询中,我在具有名为 date 的列的表中插入行,该列默认为 CURRENT_TIMESTAMP。

这样插入行:

INSERT INTO `sessions` (`user_id`) VALUES `1`

(会话表有一个date 列,默认为 CURRENT_TIMESTAMP)

但是插入到数据库中的值仍然指向服务器的时区:((

任何想法如何解决这个问题?

【问题讨论】:

当你说插入数据库的值指向服务器时区时,你如何检查?还通过您使用SET SESSION time_zone 技巧的连接? 你在运行INSERT之前关闭连接吗? 我在 phpMyAdmin 上检查它,直到脚本执行结束才关闭连接 在显示 phpMyAdmin 时是否可能是转换回来的任何线索? 【参考方案1】:

你要明白MySQL维护多个时区设置:

系统时区(基本上是操作系统设置的时区) 服务器时区(MySQL使用的时区) 客户端时区(每个连接使用的会话时区)

详情请见http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html

日期/时间值以两种不同的方式存储:

所有基于 unix 时间戳的值始终以 UTC 格式存储。当它们被存储和读取时,它们会在内部动态地从客户端时区转换到客户端时区。 NOW() 和 CURTIME() 函数也是如此,因为它们是基于时间戳的。 DATE、TIME 和 DATETIME 列(以年-月-日时-分-秒格式存储它们的值)不受时区设置的影响,并且永远不会转换。

从上面可以清楚地看出,当您从基于 unix 时间戳的列中读取时看到的值不一定是真正存储在数据库中的值。它们使用服务器时区和客户端时区进行转换。如果您不了解机制的细节,结果可能会令人困惑。

对于第一次测试,尝试通过执行来找出每个客户端程序中的当前设置

SELECT @@global.time_zone, @@session.time_zone;

全球时区将始终相同。但是会话时区可能因客户端应用程序而异,并且会改变您的读写操作的结果。

【讨论】:

谢谢,确实很受启发!我意识到 phpMyAdmin 正在显示转换为服务器时区的时间,但是如果我在设置会话时区后从脚本中的数据库中读取它们,它们会正确显示,所以只是 phpMyAdmin 让我感到困惑:) @DanyKhalife 感谢您对此发表评论,以为我疯了。 @Jpsy Greate answer..我有疑问如何在 mysql confiq 文件中设置客户端时区??? @goodyzain 无法在配置中设置客户端时区。它是基于每个会话确定的。见the MySQL docs:Per-connection time zones. Each client that connects has its own time zone setting, given by the session time_zone variable. Initially, the session variable takes its value from the global time_zone variable, but the client can change its own time zone with this statement: mysql> SET time_zone = timezone;

以上是关于如何正确设置mysql时区的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将时区设置为 UTC,以便以这种格式正确保存和检索所有时间戳?

即使系统设置不正确,如何在JavaScript中找到正确的时区?

BUG- MySQL时区设置错误

mySQL 将 NOW() 存储在正确的服务器时区吗? [复制]

MySQL出现时区错误的解决方法

mysql修改和查看时区(十五)