原文:http://dev.10086.cn/cmdn/wiki/index.php?doc-view-4206.html
僅僅是記錄下知識點,在寫項目時遇到的問題,點點滴滴之記錄。。。
SQLITE資料類型
SQLite與其他常見的DBMS的最大不同是它對資料類型的支援。其他常見的DBMS通常支援強型別的資料,也就是每一列的類型都必須預先指定,但是SQLite採用的是弱類型的欄位。實際上,其內部僅有下列五種儲存類型:
NULL: 表示一個NULL值
INTEGER: 用來儲存一個整數,根據大小可以使用1,2,3,4,6,8位來儲存.
REAL: IEEE 浮點數
TEXT: 按照字串來儲存
BLOB: 按照二進位值儲存,不做任何改變.
要注意,這些類型是值本身的屬性,而不是列的屬性.
但是為了和其他DBMS(以及SQL標準)相容,在其create table語句中可以指定列的類型,為此,SQLite有個列相似性的概念(Column Affinity). 列相似性是列的屬性,SQLite有以下幾種列相似性:
TEXT: TEXT列使用NULL,TEXT或者BLOB儲存任何插入到此列的資料,如果資料是數字,則轉換為TEXT.
NUMERIC: NUMERIC列可以使用任何儲存類型,它首先試圖將插入的資料轉換為REAL或INTEGER型的,如果成功則儲存為REAL和INTEGER型,否則不加改變的存入.
INTEGER:和NUMERIC類似,只是它將可以轉換為INTEGER值都轉換為INTEGER,如果是REAL型,且沒有小數部分,也轉為INTEGER
REAL: 和NUMERIC類型 只是它將可以轉換為REAL和INTEGER值都轉換為REAL.
NONE:不做任何改變的嘗試.
SQLite根據create table語句來決定每個列的列相似性.規則如下(大小寫均忽略):
1. 如果資料類型中包括INT,則是INTEGER
2. 如果資料類型中包括CHAR,CLOB,TEXT則是TEXT
3. 如果資料類型中包括BLOB,或者沒有指定資料類型,則是NONE
4. 如果資料類型中包括REAL,FLOA或者DOUB,則是REAL
5. 其餘的情況都是NUMERIC
由上可知,對於sqlite來說 char,varchar,nchar,nvarchar等都是等價的,且後面最大長度也是沒有意義的。但是對於其他DBMS卻不是相同的。另外,列相似性僅僅是向Sqlite提出了一個儲存資料的建議,即使實際儲存的資料類型和列相似性不一致,SQLite還是可以成功插入的,下面給出一個例子來說明下以上論述,注意,這個例子需要在SQLite的命令列下運行,如果在SQLite Expert工具下執行,SQLite會進行一些額外的處理。要注意SQLite的這種特性可能會給SQLite的ADO驅動造成一些麻煩,因為.NET都是強型別的語言,必須把資料庫中的欄位轉換為合適的類型,所以在插入資料的時候,還是應該嚴格的按照create
table中的定義插入資料。
(2)自增列
在SQL Server中,只需要指定identity(1,1)就可以設定自增列,但是在SQLite中不支援這樣做。在SQLite中,任何一張表都有一個欄位類型是Integer,且是自增的,這個列是作為B樹的索引的,它的名字是ROWID,如所示:
test2表雖然只有一列,但是ROWID列還是存在的。在程式中對任何一張表都可以使用ROWID作為自增列。不過這樣可能導致和其他資料庫的不相容,SQLite中如果一個列的宣告類型是Integer,並且是主鍵,那麼這個列的名字就成為ROWID的別名。注意,宣告類型必須是 Integer,而不能是int或bigint之類。例如:
注意上面例子的最後3條語句,它顯示了SQLite預設的自增列演算法是在當前表中最大的數再加1,這樣可能導致的結果是ID被重複使用——當最後一條資料被刪除的時候。這與SQL Server的Identity列的行為是不一致的,例如:
SQL Server會記住每一次插入的序號,哪怕它已經被刪除了。要實現SQL Server 這樣的效果,需要使用autoincrement關鍵字。如下例所示:
不過 autoincrement關鍵字不被SQL Server支援(我不知道SQL 92標準中是否有此關鍵字),同樣SQL Server的 indentity關鍵字在SQLite中也無法使用,因為SQLite只要求宣告類型必須是integer才可以啟用自增列。所以,我想不出什麼方法能使建庫的指令碼能夠不加修改的被兩種資料庫使用。
(3) 日期函數
Sqlite的日期函數比較有特色,它的使用本質上是調用C的庫函數strftime,基本使用方法如下:
(4) 不被支援的特性
使用者自訂函數,預存程序
外鍵的約束(不過可以通過自訂觸發器來替代)
right out join , full out join
grant revoke