当前位置: 首页 > 面试题库 >

如何正确设置MySQL时区

商璞
2023-03-14
问题内容

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

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



 类似资料:
  • 问题内容: 我在设置布局时遇到一些问题。(不要介意按钮的大小,我只想正确地了解布局)。 Here’s my code: 谁能帮助我了解布局的工作原理? 我一直在观看很多视频,并尝试过不同的布局,但仍然无法正确完成。告诉我是否使用了正确的布局,或者是否应该更改布局 。 问题答案: 如 该答案中所建议的那样,可以为左部分提供所需的全部控制。如果您愿意为简单起见而牺牲一些控制权,则可以在a里面放两个面板

  • 问题内容: 我正在尝试运行Java程序,但是它采用默认的GMT时区而不是OS定义的时区。我的JDK版本是1.5,操作系统是Windows Server Enterprise(2007) Windows指定了中央时区,但是当我运行以下程序时,它给了我GMT时间。 这是输出 请注意,我不想从应用程序中设置时区。我希望JVM使用的时区应该是操作系统中指定的时区。(对于具有JDK 1.4版和Microso

  • 问题内容: 我不时看到有关连接数据库的问题。 大多数答案不是我做的方式,否则我可能只是无法正确获得答案。无论如何; 我从未考虑过,因为我的工作方式对我有效。 但是这里有个疯狂的想法;也许我做错了所有,如果是这样的话;我真的很想知道如何使用PHP和PDO正确连接到MySQL数据库并使其易于访问。 这是我的做法: 首先,这是我的文件结构 (向下精简) : index.php 在最顶部,我有。 load

  • 问题内容: 遵循OnlyOffice帮助中心的说明,将创建由浏览器声明为无效的安全证书,因为它是自签名的。 目的是在适用于NextCloud的Docker上使用OnlyOffice的服务器,该服务器已在另一台服务器上正常运行。 当前,已在说明建议的目录中创建证书: 我已经按照所有给定的步骤进行操作,但是它不起作用。 有没有办法使用LetsEncrypt代替自签名证书? 我不是IT管理人员,我是一个

  • 我目前正在做一个游戏,你必须避免小行星。我开始使用任意单位。 此外,我正在使用一个: 在游戏屏幕中,小行星看起来变形了:

  • 我正在尝试使用改型2创建天气应用程序,现在我很难正确设置通话。 以下是有效的URL: 所以,我有我的API密钥和BASE URL是:http://api.openweathermap.org...这是我的Retrofit服务中的方法: 我得到的错误是: Java语言lang.IllegalArgumentException:URL查询字符串“q={city}/ 所以我试着这样做: 我得到了同样的错