我在使用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的论据:
TIMESTAMP给我的唯一好处是当我手动读取mysql表中的值并需要“看到”它们时。
是否有任何令人信服的理由使用TIMESTAMP而不是UNSIGNED INT?
答案 0 :(得分:25)
TIMESTAMP的参数
DEFAULT CURRENT_TIMESTAMP
或ON UPDATE CURRENT_TIMESTAMP
创建自动时间戳列(每个表只有一列,直到MySQL 5.6.5)FROM_UNIXTIME()
函数 - 它可以更轻松地编写可以使用索引的查询在PHP中
>> date('Y-m-d h:i:s',4294967295);
'1969-12-31 11:59:59'
所以范围实际上是相同的
在TIMESTAMP列上使用UNIX_TIMESTAMP()时,该函数 直接返回内部时间戳值,没有隐式 “字符串到Unix时间戳”转换
答案 1 :(得分:9)
TIMESTAMP的唯一真正用途是当您希望在更新行时自动更新该字段(这是该字段的默认行为),或者当数据存储要求严格到每行4个字节时与你不同。
真的比较应该在DATETIME和UNSIGNED INT之间,我推荐DATETIME因为:
SELECT UNIX_TIMESTAMP(field) FROM table
,无需选择原始值并使用strtotime 在我看来,单独的第二点确实消除了存储整数的任何理由。
答案 2 :(得分:3)
这可能不是一个“科学”的答案,但我总是发现MySql在TIMESTAMP列上处理转换,算术,比较等方式令人困惑。 UNSIGNED INT专栏更直接,我总是知道会发生什么。
P.S。也许支持TIMESTAMP列的另一个原因是它能够在每次更新或插入后自动设置为当前时间,但这不是你不能没有的东西。
答案 3 :(得分:0)
一如既往,这取决于您需要保存的内容。
例如,如果您正在使用某个API的数据,并且它以数字形式发送时间给您(秒,这在市场数据中很常见),那么将其存储为unsigned int而不是每次都转换为字符串可能会更容易,更快捷。插入之前。