42

关于以 MySQL 的 TIMESTAMP 格式保存日期和时间值与以自定义 UNSIGNED INT 格式保存日期和时间值,我处于两难境地。这里的主要考虑因素是检索速度、PHP 中的适当范围计算以及偶尔格式化为人类可读值。

每种类型所需的存储空间及其范围:

DATETIME        8 bytes  '1000-01-01 00:00:00' to '9999-12-31 23:59:59'
TIMESTAMP       4 bytes  '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC
UNSIGNED INT    4 bytes  (Maximum Value 4294967295)

我根本不需要 DATETIME 的范围。我在 TIMESTAMP 和 UNSIGNED INT 之间纠结。

支持 UNSIGNED INT 的论点:

  • UNIX 时间戳 4294967295 转换为 Sun, 07 Feb 2106 06:28:15 GMT 这比 TIMESTAMP 还多,对我来说已经足够好了
  • 直接在 PHP 中比较这些时间戳会更快,而不是通过 strtotime() 转换 TIMESTAMP 然后比较它们

TIMESTAMP 给我的唯一优势是当我手动从 mysql 表中读取值并需要“查看”它们时。

是否有任何令人信服的理由使用 TIMESTAMP 而不是 UNSIGNED INT?

4

4 回答 4

30

TIMESTAMP 的参数

  • 它以 UTC 时区隐式存储数据。无论您的会话时区是什么。如果您需要使用不同的时区,这很有用。
  • 您可以使用DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP(仅在 MySQL 5.6.5 之前每个表一列)具有自动时间戳列
  • 您可以使用 datetime 函数进行日期比较、加法、减法、范围查找等,而无需使用FROM_UNIXTIME()函数 - 这将使编写可以使用索引的查询更加容易
  • 在 PHP 中

    >> date('Y-m-d h:i:s',4294967295);
    '1969-12-31 11:59:59'
    

    所以范围实际上是相同的

当 UNIX_TIMESTAMP() 用于 TIMESTAMP 列时,该函数直接返回内部时间戳值,没有隐式的“字符串到 Unix 时间戳”转换

于 2011-08-11T16:14:34.240 回答
8

TIMESTAMP 的唯一真正用途是当您希望在更新行时自动更新该字段(这是该字段的默认行为),或者当数据存储要求非常严格以至于每行 4 个字节确实对你。

确实应该在 DATETIME 和 UNSIGNED INT 之间进行比较,我推荐 DATETIME,因为:

  • 您可以使用 MySQL 的本机日期/时间函数按日期范围等进行选择。
  • 选择这些日期作为 UNIX 时间戳非常容易,以便在 PHP: 中轻松格式化SELECT UNIX_TIMESTAMP(field) FROM table,无需选择原始值并使用 strtotime
  • 如果需要(如您所指出的),可以更轻松地直接读取和编辑数据库中的字段。
  • 日期范围没有限制

在我看来,仅第二点确实消除了以整数存储的任何理由。

于 2011-08-11T16:41:45.913 回答
5

这可能不是一个“科学”的答案,但我总是发现 MySql 在 TIMESTAMP 列上处理转换、算术、比较等的方式令人困惑。UNSIGNED INT 列更直接,我总是知道会发生什么。

PS 也许支持 TIMESTAMP 列的另一件事是它能够在每次更新或插入后自动设置为当前时间,但这不是你不能没有的东西。

于 2011-08-11T16:15:18.143 回答
0

与往常一样,这取决于您需要保存的内容。
例如,如果您正在使用来自某个 API 的数据并将时间作为数字(秒,这在市场数据中很常见)发送给您,那么将其存储为 unsigned int 而不是每次都转换为字符串可能会更容易和更快在插入之前。

于 2020-12-17T09:39:23.623 回答