我有一个关于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)
但是插入数据库中的值仍然指向服务器的时区:((
任何想法如何解决这个问题?
答案 0 :(得分:19)
您必须了解MySQL维护多个时区设置:
有关详细信息,请参阅http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html。
日期/时间值以两种不同的方式存储:
从上面可以清楚地看到,从基于unix时间戳的列读取时看到的值不一定是真正存储在DB中的值。它们使用服务器时区和客户端时区进行转换。如果您不了解机制的细节,结果可能会令人困惑。
对于第一次测试,尝试通过执行
找出每个客户端程序中的当前设置SELECT @@global.time_zone, @@session.time_zone;
全球时区将始终相同。但是会话时区可能因客户端应用程序而异,并且会改变读写操作的结果。