【发布时间】:2019-09-23 14:18:17
【问题描述】:
我的数据库中有一个名为time 的列。该列的类型为timestamp,默认值为CURRENT_TIMESTAMP
但经过一些插入后,在phpMyAdmin 中,它会将值显示为日期时间,例如2019-05-05 04:24:45 甚至时区也显示在那里并且可以更改!
我认为 MySQL 的时间戳是 4 个字节(与 8 个字节的日期时间相比)并且不存储时区,并且数据与 INT(10) 相同,例如:1557094115(自 1970 年以来经过的秒数或类似的东西)
谁能解释一下,是bug还是什么?
MySQL 版本 5.7.25
编辑 1(截图):
这是一个TIMESTAMP 列,默认值为CURRENT_TIMESTAMP
如您所见,它显示为DATETIME,我无法将它与 unix_timestamp 的整数值进行比较......我们也可以将 TimeZone 更改为任何值(我认为时间戳不存储时区......)
编辑 2:
如果(基于一个答案)MySQL 在内部将其存储为整数,那么为什么我不能将它与整数进行比较? (以下查询无效)
DELETE FROM `table` WHERE time < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL :days DAY))
SQLSTATE[22007]:无效的日期时间格式:1292 不正确的日期时间值:第 1 行的列“时间”的“1555980012”
我也在 Sequel Pro 和 MySQLWorkbench 中尝试过,结果相同
【问题讨论】:
-
在内部,所有内容都以某种方式存储为数字,甚至是字母;这就是计算机的工作方式。但是,您已告诉数据库以特定方式处理这些值,可以是 DateTime 值,也可以是特定时间点。它在内部的存储方式无关紧要,只要它以您告诉它的人类可读格式输出即可。下面的两个答案相互补充,并描绘了 DateTime 和 Timestamp 数据类型之间差异和相似之处的全貌。
-
那我猜我得用
int(10)来存储实际的时间戳 -
是的,您可以将其存储为整数,但问题是为什么?将其存储为原生 MySQL 类型为您提供了更多选项,为了显示,您可以通过
UNIX_TIMESTAMP()获取自 UNIX 纪元以来秒数的整数值。 -
我只需要比较 X 秒是否经过(例如事件发生后 300 秒),这可以在 int 上轻松完成,但在 Datetime 上需要额外的功能!即使现在我了解它们是如何存储的,但我仍然不确定如果有人需要,当有实际的 Datetime 类型可用时,它们为什么会将时间戳显示为 Datetime。
-
@Dharman - 养成将列放在一边而常量表达式放在另一边的习惯,这样优化器就有机会使用
INDEX:myDT > NOW() - INTERVAL 300 SECOND
标签: mysql datetime phpmyadmin timestamp