0

阅读https://sqlite.org/datatype3.html后指出

“SQLite 没有专门用于存储日期和/或时间的存储类。”

但能够运行这个

CREATE TABLE User (ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, BORN_ON DATE NULL)

然后在“DB Browser for SQL”中看到它,如下所示:

在此处输入图像描述

我开始怀疑 SQLite 是否支持 Date 类型,它只是“伪造”使用其他类型的支持。即使是这样,为什么 DB 浏览器将其视为日期?存储在数据库中的任何元信息?

4

3 回答 3

2

SQLite 不会DateNumerics 伪造。

SQLite中没有Date数据类型。

SQLite 版本 3 中的数据类型中,清楚地解释了:

SQLite 使用更通用的动态类型系统

除了数据类型,还有 5 个存储类:NULL、、、INTEGER和。REALTEXTBLOB

还:

SQLite 版本 3 数据库中的任何列,除了 INTEGER PRIMARY KEY 列,都可以用于存储任何存储类的值。

因此,当您Date在语句中用作列的数据类型时,CREATE TABLE您不仅限于在其中存储类似日期的值。实际上,您可以在该列中存储任何内容。

“DB Browser for SQLite”等工具可能会提供各种数据类型供您在创建表时选择以定义列。
您选择的数据类型不是限制性的,而是表明您希望在列中存储什么类型的数据。

实际上,您甚至可以在不声明列的数据类型的情况下创建表:

CREATE TABLE tablename(col1, col2) 

或使用虚构的数据类型:

CREATE TABLE tablename(col1 somedatatype, col2 otherdatatype)

并插入任何数据类型的值:

INSERT INTO tablename(col1, col2) VALUES 
  (1, 'abc'),
  ('XYZ', '2021-01-06'),
  (null, 3.5)
于 2021-01-06T13:51:08.590 回答
0

根据三十二上校的建议(在页面上阅读更多内容),当您将字段声明为 Date 时,它​​的亲和力似乎是数字。

所以 SQLite 用数字“伪造”日期。

于 2021-01-06T13:35:51.543 回答
0

即使是这样,为什么 DB 浏览器将其视为日期?存储在数据库中的任何元信息?

是的,它只是存储创建列时使用的类型名称。链接页面将其称为“声明类型”。在这种情况下,您将获得NUMERIC亲和力(DATE甚至作为 3.1.1 中的示例之一给出)并且它的行为与具有此亲和力的任何其他列一样:

具有 NUMERIC 关联的列可能包含使用所有五个存储类的值。将文本数据插入 NUMERIC 列时,如果文本分别是格式良好的整数或实数文字,则文本的存储类将转换为 INTEGER 或 REAL(按优先顺序)。如果 TEXT 值是格式正确的整数文字,它太大而无法放入 64 位有符号整数,则将其转换为 REAL。对于 TEXT 和 REAL 存储类之间的转换,仅保留数字的前 15 位有效十进制数字。如果 TEXT 值不是格式正确的整数或实数,则该值存储为 TEXT。就本段而言,十六进制整数文字不被视为格式正确,而是存储为 TEXT。(这样做是为了与 3.8 版之前的 SQLite 版本保持历史兼容性。6 2014-08-15 十六进制整数文字首次引入 SQLite。)如果可以将可以精确表示为整数的浮点值插入到具有 NUMERIC 亲和性的列中,则该值将转换为整数。不会尝试转换 NULL 或 BLOB 值。

字符串可能看起来像带有小数点和/或指数表示法的浮点文字,但只要该值可以表示为整数,NUMERIC 亲和性就会将其转换为整数。因此,字符串“3.0e+5”以整数 300000 而非浮点值 300000.0 的形式存储在具有 NUMERIC 亲和性的列中。

因此,如果您插入看起来像例如的日期,"2021-01-05"它们将被存储为字符串。但

  1. 您还可以插入看起来不像日期的字符串。

  2. 如果您插入"20210105"它将被存储为数字20210105

您可以使用CHECK约束来防止插入非日期字符串。

另请参阅https://sqlite.org/lang_datefunc.html,其中说明了日期/时间函数期望的(字符串和数字)格式。

于 2021-01-06T13:08:43.920 回答