原始问题: unix时间戳的正确列格式是什么?
网络充满了混乱:一些帖子声称SQLite没有无符号类型 - 无论是什么,或者64位int类型除外(但有(反)示例调用UNSIGNED INTEGER)。数据类型页面仅在bigint示例中提及它。它还声称有一个6字节的整数,但没有为它命名。似乎我尝试使用INTEGER将4字节签名的签名存储unix时间戳作为负数。我听说有些系统也会返回64位时间戳。 OTOH我不太喜欢浪费4个字节来存储1个额外位(时间戳的最高位),即使我必须选择更大的数据格式,我宁愿选择6字节的数据格式。我甚至看过一篇声称SQLite unix时间戳属于REAL ...
的帖子完整问题: 有人可以澄清这个烂摊子吗?
答案 0 :(得分:12)
SQLite does not有无符号类型。这直接来自主要作者以及docs。而且,整数没有固定的列宽;实际的磁盘宽度是一个实现细节。
SQLite没有日期或时间数据类型。但是,它具有可以在ISO8601字符串(TEXT),Julian day numbers(REAL)和Unix时间戳(INTEGER)上运行的日期函数。
因此,如果您决定将时间字段设置为Unix时间戳,请知道它可以将向上存储到64位有符号整数,但是您现在存储的值实际上应该占用磁盘上的32位,甚至如果源值是64位time_t
。
答案 1 :(得分:12)
整数的大小
SQLite数据库中的所有列都是内部可变宽度的。 file format以1个,2个,3个,4个,6个或8个字节存储整数,具体取决于数字的大小,加上标题中的一个字节来指示大小。因此,总的来说,存储为整数的Unix日期将占用5个字节,直到2038-01-19和之后的7个字节。
从C API用户的角度来看,所有整数都是64位符号。
列类型
将列声明为INTEGER,UNSIGNED INTEGER,BIGINT或其他任何内容都无关紧要。 Anything with "INT" in it has integer affinity.并且,如上所述,所有整数都是64位符号,但通常不会以这种方式存储。
答案 2 :(得分:0)
我的偏好是64位整数。自1970-01-01在2038年用完以来,无符号32位整数的经典情况是秒数。请参阅http://en.wikipedia.org/wiki/Unix_time和http://en.wikipedia.org/wiki/Year_2038_problem。使用64位无符号整数,您是安全的
答案 3 :(得分:0)
你能给出一个你的意思的例子吗?“看来我尝试使用INTEGER将4字节签名的商店unix时间戳记作为负数。”?
如果您还没有我建议在datatypes(第1.2节日期和时间数据类型)和date and time functions上阅读SQLite文档。
答案 4 :(得分:0)
如果您使用的是内存情况至关重要的嵌入式系统,您可以考虑通过将64位值移位几位来降低精度(导致精度为2,4,8 ...秒而不是1 sec)并使用32位值来存储它。