首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确设置mysql时区

如何正确设置mysql时区
EN

Stack Overflow用户
提问于 2011-12-09 00:13:56
回答 1查看 18.1K关注 0票数 8

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

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

代码语言:javascript
复制
mysql_query("SET SESSION time_zone = '$offset';"); // Offset is properly calculated, no worries about that

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

代码语言:javascript
复制
$q = mysql_query("SELECT NOW() as now");
$row = mysql_fetch_array($row);
echo $row["now"];

执行该代码后,将正确显示时间。

但是,在其他一些查询中,我在具有名为date的列的表中插入行,该列的缺省值为CURRENT_TIMESTAMP。

插入行的方式如下:

代码语言:javascript
复制
INSERT INTO `sessions` (`user_id`) VALUES `1`

( sessions表有一个缺省为CURRENT_TIMESTAMP的date列)

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

有什么办法解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-09 04:35:13

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

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

详情请参见http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html

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

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

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

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

代码语言:javascript
复制
SELECT @@global.time_zone, @@session.time_zone;

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

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8434030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档