【问题标题】:Store date as unix timestamp or TIMESTAMP data type in MySQL?在 MySQL 中将日期存储为 unix 时间戳或 TIMESTAMP 数据类型?
【发布时间】:2015-07-04 03:16:34
【问题描述】:

我需要在 MySQL 数据库中存储日期(带时间)。我希望能够以我喜欢的方式格式化这些。那么在 MySQL 数据库中存储日期的最佳方式是什么? DATETIME 类型、TIMESTAMP 类型或只是数字数据类型中的 unix 时间戳?我将使用 PHP 检索日期。

【问题讨论】:

标签: mysql database-design timestamp


【解决方案1】:

您可以使用 DateTime 类型来存储时间戳并在 mysql 中使用 now() 插入当前时间戳,或者通过您认为合适的任何方法获取日期/时间戳。

【讨论】:

    【解决方案2】:

    通常不管你使用TIMESTAMP还是DATETIME数据类型。

    • 在旧版本中,TIMESTAMP 为 4 个字节,DATETIME 为 8 个字节。
    • DATETIME 视为时钟的图片;将TIMESTAMP 视为全球范围内的一个瞬间。也就是说,如果您连接到同一个数据库,但来自不同的时区,DATETIME 看起来相同,但 TIMESTAMP 将针对时区进行调整。
    • NOW()SELECTing转PHP等,两者都兼容。
    • 两者在外部都被视为字符串,例如 '2015-04-25 17:09:01'。
    • 由于 TIMESTAMP 存储为 32 位整数(但您看不到),它被限制在 ~1970-2038。
    • 由于DATETIME 是时钟时间,因此如果您切换到夏令时/从夏令时切换,每年都会有两次缺失/额外的时间。

    是的,您可以使用UNIX_TIMESTAMP() 并拥有INT UNSIGNED,但是看到“2015-...”不是更好吗? (那将是 4 个字节。)

    【讨论】:

    • 如果我想自己格式化时间(而不是让 SQL 来做,这是预先格式化的),unix 时间戳会不会更有用?
    • DATE_FORMAT() 为您提供了很多选择。它适用于TIMESTAMPDATEDATETIME 数据类型,无需使用FROM_UNIXTIME()
    • 但是有理由不使用 unix 时间吗?是否更喜欢在 SQL 内部格式化(使用 DATE_FORMAT())而不是在 PHP(或任何其他语言)内部格式化?我会说 unix 时间戳更通用,因为基本上每种语言都知道如何处理这些。
    • 当然,使用 unix 时间 -- 但您更喜欢将 unix 时间存储在 TIMESTAMP 字段中吗?还是INT UNSIGNED 字段(作为数字)? (我更喜欢TIMESTAMP。)
    【解决方案3】:

    我更喜欢存储它,它始终来自纪元并代表 UTC。当我们必须迎合不同的本地化和时区方面时,这会有所帮助 - 否则我们最终会将值存储在 DB 服务器默认或 JVM 默认语言环境中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 2012-08-19
      • 2020-10-19
      • 2019-12-24
      相关资源
      最近更新 更多