我刚刚测试了 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 时没有错误?
来自 Sqlite 的常见问题
SQLite 让我可以在整数类型的数据库列中插入一个字符串!
这是一个功能,而不是一个错误。SQLite 使用动态类型。它不强制执行数据类型约束。任何数据都可以插入任何列。您可以将任意长度的字符串放入整数列、布尔列中的浮点数或字符列中的日期。您在 CREATE TABLE 命令中分配给列的数据类型不会限制可以将哪些数据放入该列。每列都能够保存任意长度的字符串。(有一个例外:INTEGER PRIMARY KEY 类型的列可能只包含一个 64 位有符号整数。如果您尝试将除整数以外的任何内容放入 INTEGER PRIMARY KEY 列中,则会导致错误。)
但是 SQLite 确实使用列的声明类型作为您更喜欢该格式的值的提示。因此,例如,如果一列是 INTEGER 类型,并且您尝试将字符串插入该列,SQLite 将尝试将字符串转换为整数。如果可以,则改为插入整数。如果没有,它会插入字符串。此功能称为类型亲和性。
SQLite DATE 类型具有 NUMERIC 亲和性。尽管它的名字,NUMERIC 亲和性允许存储所有五个存储类(NULL、INTEGER、REAL、TEXT 和 BLOB)的数据。具有 NUMERIC 关联的列(例如 DATE 列)首先尝试将任何文本数据转换为 INTEGER 和 REAL。如果可以进行这种转换,它会分别使用 INTEGER 或 REAL 存储类存储数据。如果无法进行转换,则使用 TEXT 存储类存储数据。这正是你的情况。见http://www.sqlite.org/datatype3.html#affinity