今天我第一次使用SQLite数据库,我真的很想知道DATETIME
列的显示情况如1411111200
。当然,在内部它必须存储为一些整数值才能用它来进行数学运算。但谁愿意在网格输出中看到这一点,这对于人类来说是显而易见的呢?
我甚至尝试了两个程序,SQLiteStudio和SQLite Manager,两者都没有选择更改它(至少我找不到它)。
当然,根据我对SQL的了解,不需要花很长时间才能找出值的含义 - 这个查询会像我预期的那样显示它:
select datetime(timestamp, 'unixepoch', 'localtime'), * from MyTable
但是使用GUI工具时非常不舒服。所以为什么?只是因为? Unix书呆子?或者我只是得到一个错误的印象,因为我不小心尝试了唯一的2个不好的工具?
(我也很欣赏有关使用哪些工具或我可以找到隐藏设置的评论。)
答案 0 :(得分:2)
可能是因为sqlite doesn't have a first-class date type - GUI工具如何知道哪些列应该包含日期?
答案 1 :(得分:1)
这个问题意味着数据类型DATETIME
的列只能保存有效的日期时间。但是在SQLite中并非如此:你可以输入任何数字或字符串值,它将被存储和显示。
为了找出SQLite中时间戳最“自然”的方式,我创建了一个这样的表:
CREATE TABLE test ( timestamp DATETIME DEFAULT ( CURRENT_TIMESTAMP ) );
结果是以人类可读格式(2014-09-22 10:56:07
)显示!但事实上它被保存为字符串,我无法想象任何认真的软件开发人员。有什么意见吗?
该问题的原始数据库,日期时间为unixepoch,不是因为它的表定义,而是因为插入的数据就是这样。这可能是最好的选择。
因此,答案是,这些工具无法以人类可读的格式显示日期时间,因为他们无法知道它是如何编码的。它可以是自1970年以来的秒数或其他任何东西,甚至可能在行与行之间有所不同。真是一团糟。
来自Wikipedia:
一个常见的批评是SQLite的类型系统缺乏数据 由其他的静态类型列提供的完整性机制 产品。 [...]但是,它可以通过约束来实现 比如CHECK(typeof(x)='integer')。
来自the authors:
[...]大多数其他SQL数据库引擎都是静态类型的,所以有些 人们觉得使用清单打字是SQLite中的一个错误。但 SQLite的作者非常强烈地感到这是一个功能。该 在SQLite中使用清单类型是一个深思熟虑的设计决策 已经在实践中证明了SQLite更可靠,更易于使用, 特别是与动态类型编程结合使用时 语言,如Tcl和Python。