SQLite數(shù)據(jù)類型詳解
一醋粟、存儲(chǔ)種類和數(shù)據(jù)類型
SQLite將數(shù)據(jù)值的存儲(chǔ)劃分為以下幾種存儲(chǔ)類型(即在磁盤上存儲(chǔ)的格式):
? ? NULL: 表示該值為NULL值。
? ? INTEGER: 無符號(hào)整型值。
? ? REAL: 浮點(diǎn)值米愿。
? ? TEXT: 文本字符串厦凤,存儲(chǔ)使用的編碼方式為UTF-8、UTF-16BE育苟、UTF-16LE较鼓。
? ? BLOB: 存儲(chǔ)Blob數(shù)據(jù),該類型數(shù)據(jù)和輸入數(shù)據(jù)完全相同违柏。
? ? 傳統(tǒng)SQL 數(shù)據(jù)庫(kù)使用嚴(yán)格的靜態(tài)類型(即字段的數(shù)據(jù)類型是在創(chuàng)建表時(shí)確定的)笨腥,值的類型就是它所在字段的類型,而Sqlite采用的是動(dòng)態(tài)數(shù)據(jù)類型勇垛,單獨(dú)的一個(gè)字段可以包含不同存儲(chǔ)類的值,除了整型主鍵列Integer Primary Key外士鸥,Sqlite數(shù)據(jù)庫(kù)中的任何列闲孤,都可用于存儲(chǔ)任何類型的值,通過值的表示法來判斷其類型烤礁,下面就是其推理方法:
SQL語句中用單引號(hào)或雙引號(hào)括起來的文字被指派為TEXT讼积。
如果文字是未用引號(hào)括起來的數(shù)據(jù),并且沒有小數(shù)點(diǎn)和指數(shù)脚仔,被指派為INTEGER勤众。
如果文字是未用引號(hào)括起來的數(shù)據(jù),并且?guī)в行?shù)點(diǎn)或指數(shù)鲤脏,被指派為REAL们颜。
用NULL說明的值被指派為NULL存儲(chǔ)類。
如果一個(gè)值的格式為X’ABCD’猎醇,其中ABCD為16進(jìn)制數(shù)字窥突,則該值被指派為BLOB。X前綴大小寫皆可硫嘶。
由于在SQLite中阻问,即使在表聲明中明確了字段類型,仍然可以在該字段中存儲(chǔ)其它類型的數(shù)據(jù)沦疾,因此在創(chuàng)建表時(shí)不指定字段類型也是完全有效的. 如:?
sqlite>Create?Table?ex3(a,?b,?c);
另外:存儲(chǔ)分類和數(shù)據(jù)類型也有一定的差別称近,如INTEGER存儲(chǔ)類別可以包含6種不同長(zhǎng)度的Integer數(shù)據(jù)類型,然而這些INTEGER數(shù)據(jù)一旦被讀入到內(nèi)存后哮塞,SQLite會(huì)將其全部視為占用8個(gè)字節(jié)無符號(hào)整型刨秆。
雖然SQLite允許忽略數(shù)據(jù)類型, 但仍建議在Create Table語句中指定各字段的數(shù)據(jù)類型,并盡可能保證數(shù)據(jù)的存儲(chǔ)和其所在字段的類型聲明一致忆畅,這樣做的好處:a 便于數(shù)據(jù)庫(kù)的移植坛善,b方便交流。
1.1 布爾類型
SQLite 并沒有單獨(dú)的布爾存儲(chǔ)類型,而是將布爾值存儲(chǔ)為整數(shù) 0 (false) 和 1 (true)眠屎。
1.2 日期和時(shí)間類型
SQLite 沒有另外的存儲(chǔ)類型來存儲(chǔ)日期和時(shí)間剔交。SQLite 的內(nèi)置的日期和時(shí)間函數(shù)能夠?qū)⑷掌诤蜁r(shí)間存為 TEXT、REAL 或 INTEGER 值:
TEXT? ISO8601 字符串 ("YYYY-MM-DD HH:MM:SS.SSS")改衩。
REAL 儒略日數(shù) (Julian Day Numbers)岖常,按照前公歷,自格林威治時(shí)間公元前4714年11月24日中午以來的天數(shù)葫督。
INTEGER Unix 時(shí)間竭鞍,自 1970-01-01 00:00:00 UTC 以來的秒數(shù)。
應(yīng)用可以選擇這些格式中的任一種存儲(chǔ)日期和時(shí)間橄镜,并使用內(nèi)置的日期和時(shí)間函數(shù)在這些格式間自由轉(zhuǎn)換偎快。
二、 類型親和性
為了最大限度地提高 SQLite 和其它數(shù)據(jù)庫(kù)引擎之間的兼容性洽胶,SQLite 支持列的“類型親和性”的概念晒夹。列的類型親和性是指數(shù)據(jù)存儲(chǔ)于該列的推薦類型。這里重要的思想是類型是推薦的姊氓,而不是必須的丐怯。任何列仍可以存儲(chǔ)任何類型的數(shù)據(jù)。這只是讓一些列有選擇性地優(yōu)先使用某種存儲(chǔ)類型翔横。一個(gè)列的首選存儲(chǔ)類型被稱為它的“親和性”读跷。
在SQLite中,字段沒有類型或域禾唁。當(dāng)給一個(gè)字段聲明了類型效览,該字段實(shí)際上僅僅具有了該類型的親和性。聲明類型和類型親和性是兩回事荡短。類型親和性預(yù)定SQLite用什么存儲(chǔ)類在字段中存儲(chǔ)值钦铺。在存儲(chǔ)一個(gè)給定的值時(shí)到底SQLite會(huì)在該字段中用什么存儲(chǔ)類決定于值的存儲(chǔ)類和字段親和性的結(jié)合。
任何列可以存儲(chǔ)任何類型的數(shù)據(jù)肢预,但列的首選存儲(chǔ)類是它的affinity矛洞。在SQLite3數(shù)據(jù)庫(kù)中,每個(gè)表的列分配為以下類型的affinity之一:
TEXT
NUMERIC
INTEGER
REAL
NONE
一個(gè)具有 TEXT 親和性的列使用存儲(chǔ)類型 NULL烫映、 TEXT 或 BLOB 存儲(chǔ)所有數(shù)據(jù)沼本。如果數(shù)值數(shù)據(jù)被插入到一個(gè)具有 TEXT 親和性的列,則數(shù)據(jù)在存儲(chǔ)前被轉(zhuǎn)換為文本形式
數(shù)值親和性的列可能包含了使用所有五個(gè)存儲(chǔ)類的值锭沟。當(dāng)插入文本數(shù)據(jù)到數(shù)值列時(shí)抽兆,該文本的存儲(chǔ)類型被轉(zhuǎn)換成整型或?qū)崝?shù)(按優(yōu)先級(jí)排序)如果這種轉(zhuǎn)換是無損或可逆的的話。對(duì)于文本與實(shí)數(shù)類型之間的轉(zhuǎn)換族淮,如果前15個(gè)重要十進(jìn)制數(shù)字被保留的話辫红,SQLite認(rèn)為這種轉(zhuǎn)換是無損并可逆的凭涂。如果文本不能無損地轉(zhuǎn)換成整型或?qū)崝?shù),那這個(gè)值將以文本類型存儲(chǔ)贴妻。不要試圖轉(zhuǎn)換NULL或BLOB值切油。
一個(gè)字符串可能看上去像帶有小數(shù)點(diǎn)和/或指數(shù)符的浮點(diǎn)文字,但只要這個(gè)值可以用一個(gè)整型表示名惩,數(shù)值親和性就會(huì)把它轉(zhuǎn)換成一個(gè)整型澎胡。因此,字符串‘3.0e+5’以整型300000娩鹉,而不是浮點(diǎn)值30000.0的形式存儲(chǔ)在一個(gè)數(shù)值親和性的列里攻谁。
sqlite3也接受如下的數(shù)據(jù)類型:?
smallint 16 位元的整數(shù)。?
integer 32 位元的整數(shù)弯予。?
decimal(p,s) p 精確值和 s 大小的十進(jìn)位整數(shù)戚宦,精確值p是指全部有幾個(gè)數(shù)(digits)大小值,s是指小數(shù)點(diǎn)後有幾位數(shù)锈嫩。如果沒有特別指定受楼,則系統(tǒng)會(huì)設(shè)為 p=5; s=0 。?
float? 32位元的實(shí)數(shù)祠挫。?
double? 64位元的實(shí)數(shù)。?
char(n)? n 長(zhǎng)度的字串悼沿,n不能超過 254等舔。?
varchar(n) 長(zhǎng)度不固定且其最大長(zhǎng)度為 n 的字串,n不能超過 4000糟趾。?
graphic(n) 和 char(n) 一樣慌植,不過其單位是兩個(gè)字元 double-bytes, n不能超過127义郑。這個(gè)形態(tài)是為了支援兩個(gè)字元長(zhǎng)度的字體蝶柿,例如中文字。?
vargraphic(n) 可變長(zhǎng)度且其最大長(zhǎng)度為 n 的雙字元字串非驮,n不能超過 2000?
date? 包含了 年份交汤、月份、日期劫笙。?
time? 包含了 小時(shí)芙扎、分鐘、秒填大。?
timestamp 包含了 年戒洼、月、日允华、時(shí)圈浇、分寥掐、秒、千分之一秒磷蜀。?
1. 布爾數(shù)據(jù)類型:
? ? SQLite并沒有提供專門的布爾存儲(chǔ)類型召耘,取而代之的是存儲(chǔ)整型1表示true,0表示false蠕搜。
?2. 日期和時(shí)間數(shù)據(jù)類型:
? ? 和布爾類型一樣怎茫,SQLite也同樣沒有提供專門的日期時(shí)間存儲(chǔ)類型,而是以TEXT妓灌、REAL和INTEGER類型分別不同的格式表示該類型轨蛤,如:
? ? TEXT: "YYYY-MM-DD HH:MM:SS.SSS"
? ? REAL: 以Julian日期格式存儲(chǔ)
? ? INTEGER: 以Unix時(shí)間形式保存數(shù)據(jù)值,即從1970-01-01 00:00:00到當(dāng)前時(shí)間所流經(jīng)的秒數(shù)虫埂。
1. 決定字段親緣性的規(guī)則:
字段的親緣性是根據(jù)該字段在聲明時(shí)被定義的類型來決定的祥山,具體的規(guī)則可以參照以下列表。需要注意的是以下列表的順序掉伏,即如果某一字段類型同時(shí)符合兩種親緣性缝呕,那么排在前面的規(guī)則將先產(chǎn)生作用。
1). 如果類型字符串中包含"INT"斧散,那么該字段的親緣類型是INTEGER供常。
2). 如果類型字符串中包含"CHAR"、"CLOB"或"TEXT"鸡捐,那么該字段的親緣類型是TEXT栈暇,如VARCHAR。
3). 如果類型字符串中包含"BLOB"箍镜,那么該字段的親緣類型是NONE源祈。
4). 如果類型字符串中包含"REAL"、"FLOA"或"DOUB"色迂,那么該字段的親緣類型是REAL香缺。
5). 其余情況下,字段的親緣類型為NUMERIC歇僧。