我有一个关于 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`
( session 表有一个默认为 CURRENT_TIMESTAMP 的 date
列)
但数据库中插入的值仍然指向服务器的时区:((
有什么想法可以解决这个问题吗?
最佳答案
你要明白,MySQL维护了多个时区设置:
- 系统时区(基本上就是OS设置的时区)
- 服务器时区(MySQL使用的时区)
- 客户端时区(每个连接使用的 session 时区)
参见 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;
全局时区将始终相同。但是 session 时区可能因客户端应用程序而异,并且会改变您的读写操作的结果。
关于php - 如何正确设置mysql时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8434030/