原始问题:unix时间戳的正确列格式是什么?
网络充满了混乱:一些帖子声称SQLite没有无符号类型 - 无论是什么,或者除了64位int类型(但有(反)示例调用UNSIGNED INTEGER).数据类型页面仅在bigint示例中提及它.它还声称有一个6字节的整数,但没有为它命名.似乎我尝试使用INTEGER将4字节签名的签名存储unix时间戳作为负数.我听说有些系统也会返回64位时间戳.OTOH我不太喜欢浪费4个字节来存储1个额外位(时间戳的最高位),即使我必须选择更大的数据格式,我宁愿选择6字节的数据格式.我甚至看过一篇声称SQLite unix时间戳是REAL类型的帖子...
完全问题:有人可以澄清一下这个烂摊子吗?
SQLite 没有无符号类型.这直接来自主要作者以及文档.而且,整数没有固定的列宽; 实际的磁盘宽度是一个实现细节.
SQLite没有日期或时间数据类型.但是,它具有可以在ISO8601字符串(TEXT),Julian天数(REAL)和Unix时间戳(INTEGER)上运行的日期函数.
因此,如果您决定将时间字段设置为Unix时间戳,请知道它可以存储多达 64位的有符号整数,但是现在存储的值实际上应该占用磁盘上的32位,即使源值是64位也是如此time_t
.
整数的大小
SQLite数据库中的所有列都是内部可变宽度的.的文件格式存储在整数1,2,3,4,6,或8字节,这取决于数多大,加在标题中指示的大小的一个字节.因此,总的来说,存储为整数的Unix日期将占用5个字节,直到2038-01-19和之后的7个字节.
从C API用户的角度来看,所有整数都是64位签名的.
列类型
是否将列声明为INTEGER,UNSIGNED INTEGER,BIGINT或其他任何内容都无关紧要. 任何带有"INT"的东西都具有整数亲和力. 并且,如上所述,所有整数都是64位的符号,但通常不会以这种方式存储.