2010-04-22 53 views
1

我第一次通过一些SQLite文档搞乱了SQLite。特别是,我在Sourceforge上使用Command Line Shell For SQLite和SoupToNuts SQLite Tutorial当我在sqlite命令行shell中使用varchar(10)时会发生什么?

根据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种数据类型之一?还是有什么我失踪?

回答

3

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

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

因此,尽管您的更详细的数据类型被保存(显然)到元数据表中,但它们并未被SQLite使用。

+2

仍然使用更加粒度的数据类型会是一件好事吗? – romandas 2010-04-22 22:33:52

+0

除非您同时使用您的数据定义语句(DDL)和其他RDBMS,否则我没有看到任何理由这样做。 – bernie 2010-04-22 22:44:56

+0

我在想如果我想将它移植到MySQL或SQL Express之类的东西上。 – romandas 2010-04-22 22:48:08

0

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

相关问题