1

我已经读到日期时间存储在 sqlite 中的 Text、Real 或 Integer 中,但是 sqlitestudio 将 datetime 列显示为 Datetime,就像在下面的 DDL 中它显示 DATETIME 列一样:

CREATE TABLE tblWeights (
    uid         STRING,
    weight      DOUBLE,
    dt          DATETIME,
    printed     INTEGER,
    dispdt      DATETIME,
    transid     INTEGER
);

这是怎么回事?

4

2 回答 2

2

您是如何创建该表的?

我猜该应用程序只显示创建表的 DDL(由用户输入),而不是从元数据重新构建它。

为了兼容性,您可以声明一个列类型DATETIME除许多其他之外),它将被视为NUMERIC(这又是一种“灵活”类型,最终将根据数据存储 Text、Real、Integer、Null 或 Blob好像)。

于 2018-05-08T10:49:29.900 回答
2

答案将是因为这是在创建表或更改表并添加列时使用的。

实际上,您实际上可以拥有几乎任何东西的列类型(贴花),甚至类似的东西mycolumn rumplestiltskin NOT NULL,这将被记录/存储(类型关联将是 NUMERIC)。SQLite 所做的是应用算法,然后使用一些简单的规则来应用 INTEGER、TEXT、NUMERIC、REAL 或 BLOB 的类型关联:-

3.1。列亲和性的确定 列的亲和性由列的声明类型确定,根据以下规则按所示顺序确定:

如果声明的类型包含字符串“INT”,则为其分配 INTEGER 亲和性。

如果列的声明类型包含任何字符串“CHAR”、“CLOB”或“TEXT”,则该列具有 TEXT 关联。请注意,类型 VARCHAR 包含字符串“CHAR”,因此被分配了 TEXT 亲和性。

如果列的声明类型包含字符串“BLOB”或者如果未指定类型,则该列具有亲缘关系 BLOB。

如果列的声明类型包含任何字符串“REAL”、“FLOA”或“DOUB”,则该列具有 REAL 亲和性。

否则,亲和性为 NUMERIC。

请注意,确定列亲和性的规则顺序很重要。声明类型为“CHARINT”的列将同时匹配规则 1 和 2,但第一个规则优先,因此列关联性将为 INTEGER。 SQLite 版本 3 中的数据类型

但是,除了作为 rowid 别名的列rowid本身(必须具有唯一的 INTEGER)之外,您可以在任何类型的列中存储任何类型的值。根据之前给出的链接,数据的存储方式(存储类)存在细微差别。

于 2018-05-08T10:57:40.793 回答