SQLite 是动态类型的 (2020)

2021-08-05 21:13:29

SQLite 的一个小而酷的事实是它的列是灵活类型的。您可以在任何列中存储任何值!试试看:sqlite> create table t1 (v1 int, v2 varchar(10));sqlite> insert into t1 values ("abc", "this string is long than 10 characters!");sqlite> select * from t1; abc|这个字符串超过 10 个字符!sqlite> select typeof(v1), typeof(v2) from t1;text|text sqlite> create table t1 (v1 int, v2 varchar(10) NOT NULL);sqlite> insert into t1 值(“abc”,NULL);错误:NOT NULL 约束失败:t1.v2 更长的故事是列定义表达“类型关联”,SQLite 将尝试进行隐式转换以匹配类型关联,例如将数字字符的字符串转换为整数:许多数据库支持类型转换行为,但 SQLite 无法进行它所支持的转换,无论如何都无法写入字节。我很想知道更多关于这种类型系统是如何形成的。实施起来似乎更棘手,但可能有用吗?还有潜在的反有用?是否有用户完全避开列类型并实际上依赖于这种行为的正确性?