3

今天我第一次使用 SQLite 数据库,我真的很想知道DATETIME1411111200. 当然,在内部必须将其存储为某个整数值才能对其进行数学运算。但是谁想在网格输出中看到这一点,这显然是人眼所见的呢?

我什至尝试了两个程序,SQLiteStudio 和 SQLite Manager,但都没有选项来改变它(至少我找不到)。

当然,根据我对 SQL 的了解,很快就可以找出这些值的含义——这个查询会像我预期的那样显示它:

select datetime(timestamp, 'unixepoch', 'localtime'), * from MyTable

但这在使用 GUI 工具时非常不舒服。所以为什么?只是因为?Unix书呆子?或者我只是因为不小心尝试了仅有的 2 个不好的工具而产生了错误的印象?

(我也很欣赏有关使用哪些工具或在哪里可以找到隐藏设置的评论。)

4

2 回答 2

2

可能是因为 sqlite没有一流的日期类型——GUI 工具如何知道哪些列应该包含日期?

于 2014-09-19T13:57:57.480 回答
1

这个问题意味着一列数据类型DATETIME只能保存有效的日期时间。但在 SQLite 中并非如此:您可以输入任何数字或字符串值,它将按原样存储和显示。

为了找出 SQLite 中时间戳最“自然”的方式,我创建了一个如下表:

CREATE TABLE test ( timestamp DATETIME DEFAULT ( CURRENT_TIMESTAMP ) );

结果是以人类可读的格式 ( 2014-09-22 10:56:07) 显示!但实际上它被保存为字符串,我无法想象任何认真的软件开发人员会喜欢这样。任何意见?

问题中的原始数据库,日期时间为 unixepoch,不是因为它的表定义,而是因为插入的数据就是这样。这可能是最好的选择。

所以,答案是,这些工具不能以人类可读的格式显示日期时间,因为它们不知道它是如何编码的。它可以是自 1970 年以来的秒数或其他任何值,甚至可能因行而异。真是一团糟。

来自维基百科

一个普遍的批评是 SQLite 的类型系统缺乏其他产品中静态类型列提供的数据完整性机制。[...] 但是,它可以使用 CHECK(typeof(x)='integer') 之类的约束来实现。

来自作者

[...] 大多数其他 SQL 数据库引擎都是静态类型的,因此有些人认为使用清单类型是 SQLite 中的一个错误。但是 SQLite 的作者非常强烈地认为这是一个特性。在 SQLite 中使用清单类型是经过深思熟虑的设计决策,实践证明它可以使 SQLite 更可靠、更易于使用,尤其是在与 Tcl 和 Python 等动态类型编程语言结合使用时。

于 2014-09-22T10:56:07.053 回答