sqlite允许长度超过p的char(p)输入



我将一个表定义为:

CREATE TABLE Stocks (
name CHAR(24),
price CHAR(22),
symbol CHAR(3), 
PRIMARY KEY name);

具体地说,符号应该是一个3个字母的字符串,例如"0";AUS";。然而,sqlite3仍然允许我插入长度大于3的符号,例如";澳大利亚";。为什么不在输入中强制使用3个字符的数据类型?

将sqlite视为"动态类型的";SQL版本。

从其文件来看:";SQLite支持";类型亲和性";在列上。列的类型相关性是存储在该列中的数据的推荐类型。这里的重要思想是,该类型是推荐的,而不是必需的。任何列仍然可以存储任何类型的数据">

除非添加检查约束,否则在更新/插入值时不会进行检查。它只会接受新的。

事实上,您不必在create表中指定类型。类型相关性在某些操作中会产生一些问题,例如按.排序

例如:

sqlite> create table R(a);
sqlite> insert into r values (1), (-5), (3);
sqlite> select * from r order by a;
a 
--
-5
1 
3 

以及之后:

sqlite> insert into r values ('aaaa');
sqlite> insert into r values ('000');
sqlite> select * from R order by a;
a 
--
-5
1 
3 
000 
aaaa 

因此,在sqlite:中铸造值是值得的

sqlite> select * from r order by cast(a as int);
a 
--
-5
000 
aaaa 
1 
3 

请注意,"aaaa"将转换为0。可能有一种方法可以将其转换为NULL,但这是留给读者练习的。

SQLite中没有CHAR数据类型
实际上,您可以(几乎(使用任何内容作为列的数据类型,SQLite不会抱怨

您可以阅读更多关于SQLite数据类型的信息

如果您想要字符串列的最大长度,请将它们定义为TEXT,并设置CHECK约束:

CREATE TABLE Stocks (
name TEXT CHECK(LENGTH(name) <= 24),
price TEXT CHECK(LENGTH(price) <= 22),
symbol TEXT CHECK(LENGTH(symbol) <= 3), 
PRIMARY KEY (name)
);

查看简化的演示