4

TIMESTAMP 字段类型与时区相关的行为是什么?

是否有任何时间戳值按原样插入到该字段中?

或者它是否假设插入的时间戳值的时区是服务器本地时间并将其转换为 UTC?

编辑:

这是我的测试

  • 我同时运行了 PHP date() 和 MySQL 的 SELECT NOW(),它们输出的时间戳大致相同。两者的结果都不是UTC时间。

  • 我尝试通过从 PHP date() 获取的 TIMESTAMP 字段的值插入到测试表中

  • PHP date() 中的值应该已经转换为 UTC。但是,我在数据库中看到的不是 UTC。TIMESTAMP 字段的值按原样插入。

4

2 回答 2

4

TIMESTAMP 值始终保存为 UTC。

MySQL 将 TIMESTAMP 从当前时区转换为 UTC 进行存储,然后从 UTC 转换回当前时区进行检索。

默认时区将是服务器时区,可以在连接上设置。看到这个

有关更多详细信息,请参阅MySQL 文档

我可以通过一个例子来解释这一点。请在 mysql 控制台中执行查询:

mysql> CREATE TABLE `testtable` (
         `date_timestamp` TIMESTAMP NOT NULL,
         `date_datetime` DATETIME NOT NULL
       )
       ENGINE = InnoDB;
Query OK, 0 rows affected (0.06 sec)

mysql> SET time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> insert into testtable values(now(),now());
Query OK, 1 row affected (0.03 sec)

mysql> select * from testtable;
+---------------------+---------------------+
| date_timestamp      | date_datetime       |
+---------------------+---------------------+
| 2012-10-19 05:01:38 | 2012-10-19 05:01:38 |
+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> SET time_zone = '+05:30';
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> insert into testtable values(now(),now());
Query OK, 1 row affected (0.03 sec)

mysql> select * from testtable;
+---------------------+---------------------+
| date_timestamp      | date_datetime       |
+---------------------+---------------------+
| 2012-10-19 10:31:38 | 2012-10-19 05:01:38 |
| 2012-10-19 10:31:47 | 2012-10-19 10:31:47 |
+---------------------+---------------------+
2 rows in set (0.00 sec)
于 2012-10-18T11:29:33.143 回答
-4

TIMESTAMPT 值按原样插入。

于 2012-10-18T09:39:49.937 回答