2010-04-22 30 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存儲類。

相關問題