在读取https://sqlite.org/datatype3.html后,哪个状态
"SQLite没有预留用于存储日期和/或时间的存储类。“
但能运行这个
CREATE TABLE User (ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, BORN_ON DATE NULL)然后在"DB浏览器for SQL“中看到如下所示:

我开始怀疑SQLite是否支持日期类型,它的类型只是“伪造”使用其他类型的支持。既然如此,为何DB浏览器将其视为日期呢?数据库中有存储的元信息吗?
发布于 2021-01-06 13:51:08
SQLite不会用Numeric来伪造Date。
在Date中没有SQLite数据类型。
在SQLite版本3中的数据类型中,我们清楚地解释:
SQLite使用更通用的动态类型系统。
而不是数据类型,有5个存储类:NULL、INTEGER、REAL、TEXT和BLOB。
另外:
版本3数据库中的任何列(整数主键列除外)可用于存储任何存储类的值。
因此,当您使用Date作为CREATE TABLE语句中列的数据类型时,您并不局限于仅存储类似日期的值。实际上,你可以在那栏里存储任何东西。
“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-06 13:08:43
既然如此,为何DB浏览器将其视为日期呢?数据库中有存储的元信息吗?
是的,它只是存储创建列时使用的类型名称。链接页面称其为“声明类型”。在本例中,您获得了NUMERIC亲和力(DATE甚至作为3.1.1中的示例之一给出),它的行为与任何其他具有此关联的列一样:
具有数值关联的列可能包含使用所有五个存储类的值。当文本数据插入数字列时,如果文本是格式良好的整数或实文本,则文本的存储类将分别转换为整数或实(按优先顺序排列)。如果文本值是格式良好的整数文本,它太大,无法适应64位有符号整数,则将其转换为实值。对于文本和实际存储类之间的转换,只保留该数字的前15位有效小数。如果文本值不是格式良好的整数或实文本,则将该值存储为文本。为了本段的目的,十六进制整数文字不被认为是格式良好的,而是存储为文本。(这是为了与3.8.6 2014-08-15版本之前的SQLite版本进行历史兼容性,该版本首次将十六进制整数字引入到SQLite中。)如果可以精确表示为整数的浮点值插入到具有数值关联的列中,则该值将转换为整数。不尝试转换NULL或BLOB值。 字符串看起来可能像浮点文字,带有小数点和/或指数表示法,但只要该值可以表示为整数,数值关联就会将其转换为整数。因此,字符串'3.0e+5‘存储在一个列中,其数值关联为整数300000,而不是浮点值300000.0。
因此,如果您插入类似于"2021-01-05"的日期,它们将被存储为字符串。但
"20210105",它将作为数字20210105存储。可以使用CHECK约束来防止插入非日期字符串。
还请参阅datefunc.html,它说明(字符串和数字)格式日期/时间函数预期的格式。
发布于 2021-01-06 13:35:51
根据32上校的建议(在页面上阅读更多内容),当您将一个字段声明为日期时,它的关联将是数字的。
所以SQLite的“假”日期与数字。
https://stackoverflow.com/questions/65596276
复制相似问题