【问题标题】:Making sense of date-time and datatypes in SQLite理解 SQLite 中的日期时间和数据类型
【发布时间】:2021-10-12 12:35:55
【问题描述】:

我目前正在学习 SQL 和 SQLite,据我了解,SQLite 不支持 datetime 数据类型。

但是,当我运行命令 PRAGMA table_info(Orders); 时,它显示一列的类型为 datetime

我读过In SQLite, the datatype of a value is associated with the value itself, not with its container. 取自这里https://www.sqlite.org/datatype3.html

我试图理解这到底是什么意思,这可能有助于解释。

有人可以帮我理解这里发生了什么吗?

【问题讨论】:

    标签: sql sqlite sqldatatypes


    【解决方案1】:

    执行时在type 列中看到的内容:

    PRAGMA table_info(tablename)
    

    或:

    SELECT * FROM pragma_table_info('tablename');
    

    是用于在CREATE TABLE 语句中定义列的数据类型。

    SQLite 允许使用任何东西(甚至什么都没有),只要它不是保留字,作为数据类型。

    这个:

    CREATE TABLE tablename (
      column0 integer primary key, 
      column1 integer,
      column2 text,
      column3 real, 
      column4 string,
      column5 something,
      column6 Jack,
      column7, -- no data type defined
      column8 real char int -- ??,
      column9 datetime  
    );
    

    是一个有效的陈述!

    根据上述所有列定义,SQLite 将仅对定义为 integer primary key 的列 column0 强制执行类型检查。

    来自Datatypes In SQLite Version 3/Storage Classes and Datatypes

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

    当您将列定义为 datetime 时,不要期望 SQLite 能够理解您的意图并设置任何内部约束,以便您存储在其中的值类似于日期时间。
    实际上,按照Determination Of Column Affinity 中描述的规则,此列将具有NUMERIC 亲和力。

    当然,您可以使用 INTEGERREALTEXT 数据类型将日期时间值存储在列中,如 Date and Time Datatype 中所述,具体取决于您想要的日期时间形式:@987654337 @s、Julian day numbersISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS") 分别为字符串。

    总之,SQLite 永远不会抱怨定义为任何数据类型的任何列中的任何值(integer primary key 除外)。
    您有责任确保以正确的格式存储值,以便您可以读取/写入、进行计算、比较等。
    例如,切勿以"YYYY-MM-DD HH:MM:SS.SSS" 以外的任何其他格式存储文本日期时间,因为所有SQLite's datetime functions 都只能使用这种格式。

    【讨论】:

    • 非常感谢您的详细解释。这完全清除了它!
    【解决方案2】:

    要放大@forpas 的出色答案,您可以通过在表定义中使用CHECK 约束来弥补SQLite 的弱类型检查。我经常这样做来强制整数或字符串长度,您可以使用 SQLite 的日期函数来验证该值是否可以解析为日期并且位于两个值之间。

    【讨论】:

    • 谢谢!现在一切都说得通了。感谢您的参与。
    猜你喜欢
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 2013-09-28
    • 2016-06-20
    相关资源
    最近更新 更多