显示日期时间的MySQL 5.7时间戳字段?

时间:2019-05-05 22:09:06

标签: mysql datetime phpmyadmin timestamp

我的数据库中有一列名为time。此列的类型为timestamp,默认值为CURRENT_TIMESTAMP

但是在一些插入之后,phpMyAdmin中将值显示为日期时间,例如2019-05-05 04:24:45甚至是时区都显示在那里并且可以更改!

我认为MySQL的时间戳是4个字节(相比于datetime的8个字节),并且不存储时区,并且数据与INT(10)相同,例如:1557094115(自1970年以来经过的秒数) )

任何人都可以解释一下,是bug还是什么?

MySQL版本5.7.25

编辑1(屏幕截图):

这是一个TIMESTAMP列,默认值为CURRENT_TIMESTAMP enter image description here

如您所见,它显示为DATETIME,我无法将其与unix_timestamp的整数值进行比较...我们也可以将TimeZone更改为任何值(我认为时间戳记不存储时区...) enter image description here

编辑2:

如果(基于一个答案)MySQL在内部将其存储为整数,那么为什么不能将其与整数进行比较? (以下查询无效)

DELETE FROM `table` WHERE time < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL :days DAY))
  

SQLSTATE [22007]:无效的日期时间格式:1292错误的日期时间值:第1行的“时间”列为“ 1555980012”

我也在Sequel Pro和MySQLWorkbench中尝试了同样的结果

3 个答案:

答案 0 :(得分:7)

如果需要查看1557094115,则将函数UNIX_TIMESTAMP()应用于TIMESTAMPDATETIME列。相反是FROM_UNIXTIME()

mysql> SELECT UNIX_TIMESTAMP("2019-05-05 04:24:45"), FROM_UNIXTIME(1557055485);
+---------------------------------------+---------------------------+
| UNIX_TIMESTAMP("2019-05-05 04:24:45") | FROM_UNIXTIME(1557055485) |
+---------------------------------------+---------------------------+
|                            1557055485 | 2019-05-05 04:24:45       |
+---------------------------------------+---------------------------+

更多

TIMESTAMP 的内部存储为 1557055485(采用UTC);时区是在获取/存储时添加/删除的。

DATETIME的内部存储(从逻辑上,但实际上不是)是字符串“ 2019-05-05 04:24:45”,没有时区提示。 (实际上,它以某种方式打包为5个字节。)

没有任何转换功能,提取TIMESTAMPDATETIME看起来是一样的:

CREATE TABLE `dtts` (
  `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `dt` datetime DEFAULT NULL,
  `just_date` date NOT NULL,
  `di` int(11) DEFAULT NULL,
  `ts_int` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci
1 row in set (0.00 sec)

mysql> select * from dtts
    -> ;
+---------------------+---------------------+------------+------------+------------+
| ts                  | dt                  | just_date  | di         | ts_int     |
+---------------------+---------------------+------------+------------+------------+
| 2017-06-26 17:52:53 | 2011-06-08 20:45:55 | 2011-06-08 |   20110608 | 1465404577 |
| 2017-06-26 17:52:53 | 2013-03-10 02:35:47 | 2013-03-10 |   20130310 | 1465404577 |

NOW()加到两个,然后SELECTing

mysql> INSERT INTO dtts (ts, dt) VALUES (NOW(), NOW());
Query OK, 1 row affected, 1 warning (0.00 sec)

| 2019-05-08 14:14:07 | 2019-05-08 14:14:07 | 0000-00-00 |       NULL |       NULL |
+---------------------+---------------------+------------+------------+------------+

答案 1 :(得分:3)

  1. DateTime不存储时区信息(仅是值),而MySQL会将TIMESTAMP值从当前时区转换为UTC以进行存储,并从UTC转换为当前时区以进行检索。您从PhpMyAdmin中看到的是检索到的值,而不是存储的值。
  2. 自MySQL 5.6.4起,DateTime的存储已从8字节提高到5字节(+小数秒存储)Reference

答案 2 :(得分:1)

自MySQL 5.6.4起,DATETIME字段需要5字节+ 3字节小数。 TIMESTAMP类型需要4字节+ 3字节小数。这些数据类型都不存储时区信息。但是,MySQL和phpMyAdmin都根据数据库服务器的时区显示TIMESTAMP字段。您可以使用以下语句检索数据库服务器的时区信息:

SELECT @@global.time_zone, @@session.time_zone;
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`

如果您希望phpMyAdmin显示与数据库服务器不同的时区,则可以在phpMyAdmin的config.inc.php文件中设置SessionTimeZone属性。