我必须做一些与我交互的工作,并创建由SQLite.net库操纵的表。我需要能够创建其他程序不会知道它没有创建自己的表格。
在看一些模式并了解它是如何创造事物时,我注意到一些奇怪的事情。当我读到SQLite's data types时,我发现它是一个小清单,最初它看起来像我想要存储一个日期/时间我需要确保我在SELECT / INSERT中使用特殊功能/ UPDATE查询,列可以是TEXT或INTEGER或REAL。如果我在某个地方忘记了datetime()函数,我希望得到的东西不是我想要的东西(可能是一个TEXT列。)
所以,我正在查看其中一个表的架构,我在列中看到了这一点:
"LastUpdated" datetime ,
好的,好的。 '日期时间'不属于某种类型。或者是吗? '类型亲和力'规则表明' datetime'是一个有效的类型说明符,将被视为NUMERIC。好的,没有什么真的在那里。我尝试了一个查询:
sqlite> select datetime(LastUpdated) from Foo;
2016-01-06 15:37:36
这是有道理的。我打赌,如果我忘记了datetime()函数,我会得到一些傻瓜,对吗?
sqlite> select datetime(LastUpdated) from DestinationAdapter;
2016-01-06 15:37:36
呃......好的。我想,如果它是一个TEXT专栏,这是有道理的。所以我做了一个测试表:
sqlite> CREATE TABLE TestDateTime (
...> "Id" integer primary key autoincrement not null,
...> "Value" TEXT,
...> "ValueN" NUMERIC);
sqlite> INSERT INTO TestDateTime(Value, ValueN) VALUES (datetime('2015-01-06 10:20:30'), datetime('2015-01-06 10:20:30'));
sqlite> select * from TestDateTime;
1|2015-01-06 10:20:30|2015-01-06 10:20:30
行。这变得很奇怪。似乎SQLite存储的东西不是数据类型文档中讨论的值。无论它是什么,它告诉SQLite的控制台工具列中的值是日期/时间值,并且应该如此呈现。到底是怎么回事?似乎无论我为列分配什么类型,日期和时间都只是工作'。这太神奇了,不能让我感到舒服。这里真正发生了什么,它应该如何影响我编写涉及日期/时间值的查询?
答案 0 :(得分:3)
因为您尝试将文本存储到NUMERIC字段中,所以它只是将其存储为文本。它不存储日期时间值,也不知道存储日期时间,它只是存储datetime()
函数返回的字符串
从您链接的文档:(强调我的)
2.0类型亲和力
为了最大化SQLite与其他数据库之间的兼容性 SQLite支持列上的“类型亲和力”概念。 列的类型亲缘关系是存储数据的推荐类型 在那一栏。 这里的重要思想是类型 推荐,不是必需的。 任何列仍然可以存储任何类型的 数据。 只是选择的某些列会更喜欢 使用一个存储类而不是另一个。首选的存储类 一列被称为“亲和力”。
具有NUMERIC亲缘关系的列可能包含使用所有五个存储类的值。当文本数据插入NUMERIC列时, 文本的存储类转换为INTEGER或REAL(in 优先顺序)如果这种转换是无损和可逆的。 对于TEXT和REAL存储类之间的转换,SQLite 如果前15个,则认为转换是无损且可逆的 保留该数字的有效十进制数字。 如果 无法将TEXT无损转换为INTEGER或REAL 使用TEXT存储类存储该值。不尝试 转换NULL或BLOB值。