如何正确设置MySQL时区
我有一个关于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)
但是插入到数据库中的值仍指向服务器的时区:((
有什么想法如何解决这个问题?
回答:
您必须了解MySQL维护多个时区设置:
- 系统时区(基本上是OS中设置的时区)
- 服务器时区(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;
全局时区将始终相同。但是会话时区可能因客户端应用程序而异,并且会更改您的读写操作的结果。
以上是 如何正确设置MySQL时区 的全部内容, 来源链接: utcz.com/qa/435376.html