SQLite教程(七):數(shù)據(jù)類型詳解
一、存儲種類和數(shù)據(jù)類型:
SQLite將數(shù)據(jù)值的存儲劃分為以下幾種存儲類型:
NULL: 表示該值為NULL值。
INTEGER: 無符號整型值。
REAL: 浮點值。
TEXT: 文本字符串,存儲使用的編碼方式為UTF-8、UTF-16BE、UTF-16LE。
BLOB: 存儲Blob數(shù)據(jù),該類型數(shù)據(jù)和輸入數(shù)據(jù)完全相同。
由于SQLite采用的是動態(tài)數(shù)據(jù)類型,而其他傳統(tǒng)的關(guān)系型數(shù)據(jù)庫使用的是靜態(tài)數(shù)據(jù)類型,即字段可以存儲的數(shù)據(jù)類型是在表聲明時即以確定的,因此它們之間在數(shù)據(jù)存儲方面還是存在著很大的差異。在SQLite中,存儲分類和數(shù)據(jù)類型也有一定的差別,如INTEGER存儲類別可以包含6種不同長度的Integer數(shù)據(jù)類型,然而這些INTEGER數(shù)據(jù)一旦被讀入到內(nèi)存后,SQLite會將其全部視為占用8個字節(jié)無符號整型。因此對于SQLite而言,即使在表聲明中明確了字段類型,我們?nèi)匀豢梢栽谠撟侄沃写鎯ζ渌愋偷臄?shù)據(jù)。然而需要特別說明的是,盡管SQLite為我們提供了這種方便,但是一旦考慮到數(shù)據(jù)庫平臺的可移植性問題,我們在實際的開發(fā)中還是應(yīng)該盡可能的保證數(shù)據(jù)類型的存儲和聲明的一致性。除非你有極為充分的理由,同時又不再考慮數(shù)據(jù)庫平臺的移植問題,在此種情況下確實可以使用SQLite提供的此種特征。
1. 布爾數(shù)據(jù)類型:
SQLite并沒有提供專門的布爾存儲類型,取而代之的是存儲整型1表示true,0表示false。
2. 日期和時間數(shù)據(jù)類型:
和布爾類型一樣,SQLite也同樣沒有提供專門的日期時間存儲類型,而是以TEXT、REAL和INTEGER類型分別不同的格式表示該類型,如:
TEXT: "YYYY-MM-DD HH:MM:SS.SSS"
REAL: 以Julian日期格式存儲
INTEGER: 以Unix時間形式保存數(shù)據(jù)值,即從1970-01-01 00:00:00到當(dāng)前時間所流經(jīng)的秒數(shù)。
二、類型親緣性:
為了最大化SQLite和其它數(shù)據(jù)庫引擎之間的數(shù)據(jù)類型兼容性,SQLite提出了"類型親緣性(Type Affinity)"的概念。我們可以這樣理解"類型親緣性 ",在表字段被聲明之后,SQLite都會根據(jù)該字段聲明時的類型為其選擇一種親緣類型,當(dāng)數(shù)據(jù)插入時,該字段的數(shù)據(jù)將會優(yōu)先采用親緣類型作為該值的存儲方式,除非親緣類型不匹配或無法轉(zhuǎn)換當(dāng)前數(shù)據(jù)到該親緣類型,這樣SQLite才會考慮其它更適合該值的類型存儲該值。SQLite目前的版本支持以下五種親緣類型:
| 親緣類型 | 描述 |
| TEXT | 數(shù)值型數(shù)據(jù)在被插入之前,需要先被轉(zhuǎn)換為文本格式,之后再插入到目標(biāo)字段中。 |
| NUMERIC | 當(dāng)文本數(shù)據(jù)被插入到親緣性為NUMERIC的字段中時,如果轉(zhuǎn)換操作不會導(dǎo)致數(shù)據(jù)信息丟失以及完全可逆,那么SQLite就會將該文本數(shù)據(jù)轉(zhuǎn)換為INTEGER或REAL類型的數(shù)據(jù),如果轉(zhuǎn)換失敗,SQLite仍會以TEXT方式存儲該數(shù)據(jù)。對于NULL或BLOB類型的新數(shù)據(jù),SQLite將不做任何轉(zhuǎn)換,直接以NULL或BLOB的方式存儲該數(shù)據(jù)。需要額外說明的是,對于浮點格式的常量文本,如"30000.0",如果該值可以轉(zhuǎn)換為INTEGER同時又不會丟失數(shù)值信息,那么SQLite就會將其轉(zhuǎn)換為INTEGER的存儲方式。 |
| INTEGER | 對于親緣類型為INTEGER的字段,其規(guī)則等同于NUMERIC,唯一差別是在執(zhí)行CAST表達(dá)式時。 |
| REAL | 其規(guī)則基本等同于NUMERIC,唯一的差別是不會將"30000.0"這樣的文本數(shù)據(jù)轉(zhuǎn)換為INTEGER存儲方式。 |
| NONE | 不做任何的轉(zhuǎn)換,直接以該數(shù)據(jù)所屬的數(shù)據(jù)類型進(jìn)行存儲?! ?/td> |
1. 決定字段親緣性的規(guī)則:
字段的親緣性是根據(jù)該字段在聲明時被定義的類型來決定的,具體的規(guī)則可以參照以下列表。需要注意的是以下列表的順序,即如果某一字段類型同時符合兩種親緣性,那么排在前面的規(guī)則將先產(chǎn)生作用。
1). 如果類型字符串中包含"INT",那么該字段的親緣類型是INTEGER。
2). 如果類型字符串中包含"CHAR"、"CLOB"或"TEXT",那么該字段的親緣類型是TEXT,如VARCHAR。
3). 如果類型字符串中包含"BLOB",那么該字段的親緣類型是NONE。
4). 如果類型字符串中包含"REAL"、"FLOA"或"DOUB",那么該字段的親緣類型是REAL。
5). 其余情況下,字段的親緣類型為NUMERIC。
2. 具體示例:
| 聲明類型 | 親緣類型 | 應(yīng)用規(guī)則 |
| INT INTEGER TINYINT SMALLINT MEDIUMINT BIGINT UNSIGNED BIG INT INT2 INT8 |
INTEGER | 1 |
| CHARACTER(20) VARCHAR(255) VARYING CHARACTER(255) NCHAR(55) NATIVE CHARACTER(70) NVARCHAR(100) TEXT CLOB |
TEXT | 2 |
| BLOB | NONE | 3 |
| REAL DOUBLE DOUBLE PRECISION FLOAT |
REAL | 4 |
| NUMERIC DECIMAL(10,5) BOOLEAN DATE DATETIME |
NUMERIC | 5 |
注:在SQLite中,類型VARCHAR(255)的長度信息255沒有任何實際意義,僅僅是為了保證與其它數(shù)據(jù)庫的聲明一致性。
三、比較表達(dá)式:
在SQLite3中支持的比較表達(dá)式有:"=", "==", "<", "<=", ">", ">=", "!=", "<>", "IN", "NOT IN", "BETWEEN", "IS" and "IS NOT"。
數(shù)據(jù)的比較結(jié)果主要依賴于操作數(shù)的存儲方式,其規(guī)則為:
1). 存儲方式為NULL的數(shù)值小于其它存儲類型的值。
2). 存儲方式為INTEGER和REAL的數(shù)值小于TEXT或BLOB類型的值,如果同為INTEGER或REAL,則基于數(shù)值規(guī)則進(jìn)行比較。
3). 存儲方式為TEXT的數(shù)值小于BLOB類型的值,如果同為TEXT,則基于文本規(guī)則(ASCII值)進(jìn)行比較。
4). 如果是兩個BLOB類型的數(shù)值進(jìn)行比較,其結(jié)果為C運行時函數(shù)memcmp()的結(jié)果。
四、操作符:
所有的數(shù)學(xué)操作符(+, -, *, /, %, <<, >>, &, and |)在執(zhí)行之前都會先將操作數(shù)轉(zhuǎn)換為NUMERIC存儲類型,即使在轉(zhuǎn)換過程中可能會造成數(shù)據(jù)信息的丟失。此外,如果其中一個操作數(shù)為NULL,那么它們的結(jié)果亦為NULL。在數(shù)學(xué)操作符中,如果其中一個操作數(shù)看上去并不像數(shù)值類型,那么它們結(jié)果為0或0.0。
- 詳解SQL Server中的數(shù)據(jù)類型
- 詳解MySQL數(shù)據(jù)類型int(M)中M的含義
- mysql存儲引擎和數(shù)據(jù)類型(二)
- Java數(shù)據(jù)類型與MySql數(shù)據(jù)類型對照表
- SQL Server數(shù)據(jù)類型轉(zhuǎn)換方法
- SQL Server比較常見數(shù)據(jù)類型詳解
- SQL Server數(shù)據(jù)類型char、nchar、varchar、nvarchar的區(qū)別淺析
- sql使用cast進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換示例
- SQL2005中char nchar varchar nvarchar數(shù)據(jù)類型的區(qū)別和使用環(huán)境講解
- SQL的常用數(shù)據(jù)類型列表詳解
相關(guān)文章
PostgreSQL 實現(xiàn)sql放入文件批量執(zhí)行
這篇文章主要介紹了PostgreSQL 實現(xiàn)sql放入文件批量執(zhí)行,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
基于PostgreSQL/openGauss?的分布式數(shù)據(jù)庫解決方案
ShardingSphere-Proxy?作為透明數(shù)據(jù)庫代理,用戶無需關(guān)心?Proxy?如何協(xié)調(diào)背后的數(shù)據(jù)庫。今天通過本文給大家介紹基于PostgreSQL/openGauss?的分布式數(shù)據(jù)庫解決方案,感興趣的朋友跟隨小編一起看看吧2021-12-12
PostgreSQL數(shù)據(jù)庫timestamp數(shù)據(jù)類型精度進(jìn)位問題解析
PostgreSQL是一款功能強(qiáng)大的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),起源于1986年的POSTGRES項目,它支持多種數(shù)據(jù)類型,包括數(shù)值類型、字符串類型、日期時間類型等,本文介紹PostgreSQL數(shù)據(jù)庫timestamp數(shù)據(jù)類型精度進(jìn)位問題,感興趣的朋友一起看看吧2024-11-11
使用PostgreSQL為表或視圖創(chuàng)建備注的操作
這篇文章主要介紹了使用PostgreSQL為表或視圖創(chuàng)建備注的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL存儲過程循環(huán)調(diào)用方式
這篇文章主要介紹了PostgreSQL存儲過程循環(huán)調(diào)用方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
postgresql 查看當(dāng)前用戶名的實現(xiàn)
這篇文章主要介紹了postgresql 查看當(dāng)前用戶名的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01

