Android SQLite數據類型

#SQLite數據類型

##概述
我們熟知的數據庫引擎大部分採用靜態數據類型,即列定義的類型定義了值的存儲,並且值要嚴格滿足列的定義,同一列所有值的存儲方式都相同,比如定義了一個列類型爲整型 int,不能在該列上輸入’abc’。SQLite的數據類型則採用了動態類型,列定義不能決定值的存儲,值的存儲由值本身決定,因此在SQLite中,同一列會有多種存儲方式。
##數據類型與存儲類
在這裏插入圖片描述
在SQLite中,存儲分類和數據類型不是完全等價的,如INTEGER存儲類別可以包含6種不同長度的Integer數據類型,然而這些INTEGER數據一旦被讀入到內存後,SQLite會將其全部視爲佔用8個字節有符號整型。因此對於SQLite而言,同一個字段類型,可以在該字段中存儲不同類型的數據,而且即便值的存儲類型相同,底層存儲佔用的空間也與值相關,比如有的INTEGER佔用1個字節,有的INTEGER可能佔用8個字節。

(1).布爾數據類型:
SQLite並沒有提供專門的布爾存儲類型,取而代之的是存儲整型1表示true,0表示false。

(2).日期和時間數據類型:
和布爾類型一樣,SQLite也同樣沒有提供專門的日期時間存儲類型,而是以TEXT、REAL和INTEGER類型分別不同的格式表示該類型,如:
TEXT: “YYYY-MM-DD HH:MM:SS.SSS”
REAL: 以Julian日期格式存儲(儒略日(julian date)是自公元前4713年1月1日中午12時起經過的天數)
INTEGER: 以Unix時間形式保存數據值,即從1970-01-01 00:00:00到當前時間所流經的秒數。
SQLite提供typeof函數,用戶可以根據這個函數來確定給定值的存儲類型。

##類型親緣性
爲了最大化SQLite和其它數據庫引擎之間的數據類型兼容性,SQLite提出了"類型親緣性(Type Affinity)"的概念。我們可以這樣理解"類型親緣性 ",在表字段被聲明之後,SQLite都會根據該字段聲明時的類型爲其選擇一種親緣類型,當數據插入時,該字段的數據將會優先採用親緣類型作爲該值的存儲方式,除非親緣類型不匹配或無法轉換當前數據到該親緣類型,這樣SQLite纔會考慮其它更適合該值的類型存儲該值。SQLite目前的版本支持以下五種親緣類型:
在這裏插入圖片描述  
###字段親緣性的規則
字段的親緣性是根據該字段在聲明時被定義的類型來決定的,具體的規則可以參照以下列表。需要注意的是以下列表的順序,即如果某一字段類型同時符合兩種親緣性,那麼排在前面的規則將先產生作用。

1). 如果類型字符串中包含"INT",那麼該字段的親緣類型是INTEGER。
2). 如果類型字符串中包含"CHAR"、“CLOB"或"TEXT”,那麼該字段的親緣類型是TEXT,如VARCHAR。
3). 如果類型字符串中包含"BLOB",那麼該字段的親緣類型是NONE。
4). 如果類型字符串中包含"REAL"、“FLOA"或"DOUB”,那麼該字段的親緣類型是REAL。
5). 其餘情況下,字段的親緣類型爲NUMERIC。
###具體示例
在這裏插入圖片描述
4.比較與排序
在SQLite3中支持的比較表達式有:"=", “==”, “<”, “<=”, “>”, “>=”, “!=”, “<>”, “IN”, “NOT IN”, “BETWEEN”, “IS” and “IS NOT”。數據的比較結果主要依賴於操作數的存儲方式,其規則爲:
1). 存儲方式爲NULL的數值小於其它存儲類型的值。
2). 存儲方式爲INTEGER和REAL的數值小於TEXT或BLOB類型的值,如果同爲INTEGER或REAL,則基於數值規則進行比較。
3). 存儲方式爲TEXT的數值小於BLOB類型的值。
4). 如果是兩個BLOB類型的數值進行比較,其結果爲C運行時函數memcmp()的結果。
5). 如果同爲TEXT,SQLite利用特定的比較規則來判斷,支持3種比較規則:
在這裏插入圖片描述 
通過建表語句在可以在指定列上指定校對規則,比如:

CREATE TABLE t1(
    x INTEGER PRIMARY KEY,
    a,                 /* collating sequence BINARY */
    b COLLATE BINARY,  /* collating sequence BINARY */
    c COLLATE RTRIM,   /* collating sequence RTRIM  */
    d COLLATE NOCASE   /* collating sequence NOCASE */
);

參考文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章