我有一个使用SQLite的iOS应用程序。我使用FireFox和插件SQLite Manager来管理数据库。
现在我有一张这样的表:
CREATE TABLE "someTable" ("id" INTEGER NOT NULL , "timeOfEvent" DATETIME NOT NULL)
然而,我几乎可以将任何我想要的值输入到DateTime列中,如下所示:
INSERT INTO sometable (id, timeOfEvent) VALUES (1,'2012-99-99')
INSERT INTO sometable (id, timeOfEvent) VALUES (2,'yyyy-mm-dd')
...etc
为什么这可能?
答案 0 :(得分:6)
根据文档:SQLite- Data Types
SQLite 没有为存储日期和/或时间预留存储类。相反,SQLite的内置日期和时间函数能够将日期和时间存储为TEXT,REAL或INTEGER值:
- TEXT as ISO8601 strings
- 真实的朱利安日数,即公元前4714年11月24日格林威治中午以来的天数。根据预感格里高利历。
- INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数。
因此,SQLite依赖于转换值的方法。它没有自己的数据类型来限制日期/时间类型。
答案 1 :(得分:3)
SQLite是动态的。来自SQLite Query Language - CREATE TABLE
与大多数SQL数据库不同,SQLite不会根据声明的列类型限制可能插入到列中的数据类型。相反,SQLite使用动态类型。声明的列类型仅用于确定列的亲和力。