MySQL - TIMESTAMP 字段类型自动转换为 UTC?

标签 mysql

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

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

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

编辑:

这是我的测试

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

  • 我尝试使用从 PHP date() 获取的 TIMESTAMP 字段值插入测试表

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

最佳答案

TIMESTAMP 值始终保存为 UTC。

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

默认时区将是服务器时区,可以在连接上设置。参见 this .

有关详细信息,请参阅 MySQL Doc

我可以通过一个例子来解释这一点。请在 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)

关于MySQL - TIMESTAMP 字段类型自动转换为 UTC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12951329/

相关文章:

Mysql - 我可以查询事件(事件调度程序)的间隔吗?

php - html 字符集在 2 个服务器上工作不同

MYSQL - 当不正确时返回选择语句?

php - 查询返回额外的空变量

python - 从数据库中提取十进制数据并存储在数组中

mysql - 使用javafx将图像上传到数据库

php - 使用准备语句时如何创建多维数组?

mysql - 选择开始列和结束列之间的行(Unix 时间戳)

php - 不同 mysql 服务器版本的默认值

java - 按日期搜索数据库