【问题标题】:SQLITE date no type checkedSQLITE 日期未检查类型
【发布时间】:2013-10-29 23:49:20
【问题描述】:

我刚刚测试了 sqlite 并创建了一个表。

$sqlite3 plop.db

sqlite> CREATE TABLE t (d DATE);

sqlite> INSERT INTO t (d) VALUES ('Hello');

sqlite> PRAGMA table_info(t);
0|a|DATE|0||0

sqlite> SELECT * FROM t;
Hello

那么,为什么我尝试将 CHAR(5) 插入 DATE 时没有错误?

【问题讨论】:

    标签: sql sqlite date


    【解决方案1】:

    来自 Sqlite 的Frequently Asked Questions

    SQLite 让我可以在整数类型的数据库列中插入一个字符串!

    这是一项功能,而不是错误。 SQLite 使用动态类型。它不是 强制数据类型约束。任何数据都可以插入任何 柱子。您可以将任意长度的字符串放入整数列中, 布尔列中的浮点数,或字符中的日期 列。您分配给 CREATE TABLE 中的列的数据类型 命令不限制可以将哪些数据放入该列。每一个 column 能够保存任意长度的字符串。 (有一个 例外:INTEGER PRIMARY KEY 类型的列只能包含 64 位 有符号整数。如果您尝试放置其他任何内容,则会导致错误 比整数进入 INTEGER PRIMARY KEY 列。)

    但是 SQLite 确实使用列的声明类型作为提示,你 更喜欢这种格式的值。因此,例如,如果一列是 键入 INTEGER 并尝试将字符串插入该列 SQLite 将尝试将字符串转换为整数。如果可以的话,它 而是插入整数。如果没有,它会插入字符串。这 特性称为类型亲和性。

    【讨论】:

      【解决方案2】:

      SQLite DATE 类型具有 NUMERIC 亲和性。尽管它的名字,NUMERIC 亲和性允许存储所有五个存储类(NULL、INTEGER、REAL、TEXT 和 BLOB)的数据。具有 NUMERIC 亲和性的列(例如 DATE 列)首先尝试将任何文本数据转换为 INTEGER 和 REAL。如果可以进行这种转换,它会分别使用 INTEGER 或 REAL 存储类存储数据。如果无法进行转换,则使用 TEXT 存储类存储数据。这正是你的情况。见http://www.sqlite.org/datatype3.html#affinity

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-15
        • 1970-01-01
        • 2017-11-01
        • 2017-09-13
        • 1970-01-01
        • 1970-01-01
        • 2013-12-28
        相关资源
        最近更新 更多