当我在sqlite命令行shell中使用varchar(10)时会发生什么?

时间:2010-04-22 22:01:13

标签: sql sqlite types

我通过编写一些SQLite文档,第一次搞乱了SQLite。特别是,我在Sourceforge上使用Command Line Shell For SQLite和SoupToNuts SQLite Tutorial

根据SQLite datatype documentation,SQLite中只有5种数据类型。但是,在上面的两个教程文档中,我看到作者使用命令的位置,如

create table tbl1(one varchar(10), two smallint);
create table t1 (t1key INTEGER PRIMARY KEY,data TEXT,num double,timeEnter DATE);

包含SQLite未列出的数据类型,但这些命令运行正常。

此外,当我运行.dump查看SQL语句时,会保留这些数据类型规范:

sqlite> CREATE TABLE Vulnerabilities (
   ...> VulnerabilityID unsigned smallint primary key,
   ...> VulnerabilityName varchar(10),
   ...> VulnerabilityDescription longtext);
sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE Vulnerabilities (
VulnerabilityID unsigned smallint primary key,
VulnerabilityName varchar(10),
VulnerabilityDescription longtext);
COMMIT;
sqlite>

那么,是什么给出的? SQLite是否为SQL中指定的任何数据类型保留了引用,并将其在后台转换为其5种数据类型之一?或者还有其他我想念的东西?

2 个答案:

答案 0 :(得分:3)

SQLite uses dynamic typing
SQLite允许您在该VARCHAR(10)列中插入一个整数 如果在该列中插入长度超过10个字符的字符串,SQLite不会抱怨。

正如el.pescado所提到的,SQLite的存储类是AKA“亲缘关系” 如果您尝试插入属于a particular affinity的列,则SQLite将尝试转换该值以匹配关联。
如果转换不起作用,则按原样插入值。

因此,当您将更精细的数据类型保存(显然)到元数据表时,SQLite不会使用它们。

答案 1 :(得分:0)

没有五种数据类型,而是“真实”数据类型所属的5种数据类型“类”。因此,TINYINT,SMALLINT和BIGINT是三种不同的数据类型,但都属于INTEGER存储类。