Php 如何正确设置mysql时区

Php 如何正确设置mysql时区,php,mysql,timezone,Php,Mysql,Timezone,我有一个关于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

我有一个关于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
列)

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


您知道如何解决这个问题吗?

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

  • 系统时区(基本上是操作系统中设置的时区)
  • 服务器时区(MySQL使用的时区)
  • 客户端时区(每个连接使用的会话时区)
有关详细信息,请参阅

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

  • 所有基于unix时间戳的值始终存储在UTC中。当存储和读取它们时,它们会在内部动态地从客户端时区转换到客户端时区。NOW()和CURTIME()函数也是如此,因为它们是基于时间戳的
  • 日期、时间和日期时间列(以年-月-日-小时-分-秒格式存储其值)不受时区设置的影响,并且从不转换
从上面可以清楚地看出,从基于unix时间戳的列中读取时看到的值不一定是数据库中真正存储的值。它们使用服务器时区和客户端时区进行转换。如果您不了解机制的详细信息,则结果可能会混淆

对于第一个测试,尝试通过执行

SELECT @@global.time_zone, @@session.time_zone;

全局时区将始终相同。但是会话时区可能因客户端应用程序而异,并且会更改读写操作的结果。

当您说插入DB中的值指向服务器时区时,您如何检查?也可以通过执行
设置会话的连接进行检查N时区
诀窍?在运行
插入之前是否关闭连接?我正在phpMyAdmin上检查它,并且在脚本执行结束之前没有关闭任何连接显示它时,是否有任何线索表明phpMyAdmin可能是转换回来的?谢谢,确实非常有启发性!我意识到phpMyAdmin正在显示times转换为服务器时区,但如果在设置会话时区后从脚本中的DB读取它们,它们会正确显示,因此让我困惑的只是phpMyAdmin:)@DanyKhalife感谢您对此发表评论,我觉得我疯了。@Jpsy Greate response.。我有一个问题,您如何在mysql confiq文件中设置客户端时区???@goodyzain客户端时区不能在配置中设置。它是基于每个会话确定的。请参阅:
每个连接时区。每个连接的客户端都有自己的时区e设置,由会话时区变量提供。最初,会话变量从全局时区变量获取其值,但客户端可以使用以下语句更改自己的时区:mysql>SET time\u zone=timezone;