如何正确设置mysql时区

Dan*_*ife 8 php mysql timezone

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

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

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

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

$q = mysql_query("SELECT NOW() as now");
$row = mysql_fetch_array($row);
echo $row["now"];
Run Code Online (Sandbox Code Playgroud)

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

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

行插入如下:

INSERT INTO `sessions` (`user_id`) VALUES `1`
Run Code Online (Sandbox Code Playgroud)

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

但是插入DB中的值仍然指向服务器的时区:((

任何想法如何通过这个?

Jps*_*psy 20

您必须了解MySQL维护多个时区设置:

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

有关详细信息,请参阅http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html.

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

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

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

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

SELECT @@global.time_zone, @@session.time_zone;
Run Code Online (Sandbox Code Playgroud)

全球时区将始终相同.但是会话时区可能与客户端应用程序不同,也会改变读写操作的结果.

  • 谢谢,非常高兴!我意识到phpMyAdmin正在显示转换为服务器时区的时间,但是如果我在设置会话时区后在我的脚本中从DB读取它们它们会显得正确,所以只是phpMyAdmin令我感到困惑:) (2认同)