如何正确设置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中找到正确的时区?