SQLITE日期未检查类型

SQLITE日期未检查类型,sql,sqlite,date,Sql,Sqlite,Date,我刚刚测试了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 那么,当我尝试在日期中插入字符(5)时,为什么没有错误呢?来自Sqlite的 SQLit

我刚刚测试了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
那么,当我尝试在日期中插入字符(5)时,为什么没有错误呢?

来自Sqlite的

SQLite允许我在integer类型的数据库列中插入字符串

这是一个特性,不是bug。SQLite使用动态类型。事实并非如此 强制执行数据类型约束。任何数据都可以插入到任何 专栏。可以将任意长度的字符串放入整数列, 布尔列中的浮点数或字符中的日期 柱。为CREATE表中的列指定的数据类型 命令不限制可以将哪些数据放入该列。每一个 列可以容纳任意长度的字符串。(有一个 例外:INTEGER主键类型的列只能包含64位 带符号整数。如果您尝试放置任何其他内容,将导致错误 将整数转换为整数主键列。)

但是SQLite使用声明的列类型作为提示 首选该格式的值。例如,如果一列是 键入INTEGER并尝试在该列中插入一个字符串SQLite 将尝试将字符串转换为整数。如果可以的话,我会的 而是插入整数。如果不是,则插入字符串。这 该特性称为类型关联


SQLite日期类型具有数值关联性。尽管名称不同,数值关联允许存储所有五个存储类(NULL、INTEGER、REAL、TEXT和BLOB)的数据。具有数值相关性的列(例如日期列)首先尝试将任何文本数据转换为整数和实数。如果可以进行这种转换,它将分别使用整数或实数存储类存储数据。如果无法进行转换,则使用文本存储类存储数据。这就是你的情况。看