SQLite學習手冊 資料型別

2021-08-01 13:39:37 字數 3546 閱讀 3245

一、儲存種類和資料型別:

sqlite將資料值的儲存劃分為以下幾種儲存型別:

null: 表示該值為null值。

integer: 無符號整型值。

real: 浮點值。

text: 文字字串,儲存使用的編碼方式為utf-8、utf-16be、utf-16le。

blob: 儲存blob資料,該型別資料和輸入資料完全相同。

由於sqlite採用的是動態資料型別,而其他傳統的關係型資料庫使用的是靜態資料型別,即欄位可以儲存的資料型別是在表宣告時即以確定的,因此它們之間在資料儲存方面還是存在著很大的差異。在sqlite中,儲存分類和資料型別也有一定的差別,如integer儲存類別可以包含6種不同長度的integer資料型別,然而這些integer資料一旦被讀入到記憶體後,sqlite會將其全部視為占用8個位元組無符號整型。因此對於sqlite而言,即使在表宣告中明確了字段型別,我們仍然可以在該字段中儲存其它型別的資料。然而需要特別說明的是,儘管sqlite為我們提供了這種方便,但是一旦考慮到資料庫平台的可移植性問題,我們在實際的開發中還是應該盡可能的保證資料型別的儲存和宣告的一致性。除非你有極為充分的理由,同時又不再考慮資料庫平台的移植問題,在此種情況下確實可以使用sqlite提供的此種特徵。

1. 布林資料型別:

sqlite並沒有提供專門的布林儲存型別,取而代之的是儲存整型1表示true,0表示false。

2. 日期和時間資料型別:

和布林型別一樣,sqlite也同樣沒有提供專門的日期時間儲存型別,而是以text、real和integer型別分別不同的格式表示該型別,如:

text: "yyyy-mm-dd hh:mm:ss.sss"

real: 以julian日期格式儲存

integer: 以unix時間形式儲存資料值,即從1970-01-01 00:00:00到當前時間所流經的秒數。

二、型別親緣性:

為了最大化sqlite和其它資料庫引擎之間的資料型別相容性,sqlite提出了"型別親緣性(type affinity)"的概念。我們可以這樣理解"型別親緣性 ",在表字段被宣告之後,sqlite都會根據該欄位宣告時的型別為其選擇一種親緣型別,當資料插入時,該字段的資料將會優先採用親緣型別作為該值的儲存方式,除非親緣型別不匹配或無法轉換當前資料到該親緣型別,這樣sqlite才會考慮其它更適合該值的型別儲存該值。sqlite目前的版本支援以下五種親緣型別:

親緣型別

描述

text

數值型資料在被插入之前,需要先被轉換為文字格式,之後再插入到目標欄位中。

numeric

當文字資料被插入到親緣性為numeric的字段中時,如果轉換操作不會導致資料資訊丟失以及完全可逆,那麼sqlite就會將該文字資料轉換為integer或real型別的資料,如果轉換失敗,sqlite仍會以text方式儲存該資料。對於null或blob型別的新資料,sqlite將不做任何轉換,直接以null或blob的方式儲存該資料。需要額外說明的是,對於浮點格式的常量文字,如"30000.0",如果該值可以轉換為integer同時又不會丟失數值資訊,那麼sqlite就會將其轉換為integer的儲存方式。

integer

對於親緣型別為integer的字段,其規則等同於numeric,唯一差別是在執行cast表示式時。

real

其規則基本等同於numeric,唯一的差別是不會將"30000.0"這樣的文字資料轉換為integer儲存方式。

none

不做任何的轉換,直接以該資料所屬的資料型別進行儲存。  

1. 決定字段親緣性的規則:

欄位的親緣性是根據該字段在宣告時被定義的型別來決定的,具體的規則可以參照以下列表。需要注意的是以下列表的順序,即如果某一字段型別同時符合兩種親緣性,那麼排在前面的規則將先產生作用。

1). 如果型別字串中包含"int",那麼該字段的親緣型別是integer。

2). 如果型別字串中包含"char"、"clob"或"text",那麼該字段的親緣型別是text,如varchar。

3). 如果型別字串中包含"blob",那麼該字段的親緣型別是none。

4). 如果型別字串中包含"real"、"floa"或"doub",那麼該字段的親緣型別是real。

5). 其餘情況下,欄位的親緣型別為numeric。

2. 具體示例:

宣告型別

親緣型別

應用規則

intinteger

tinyint

smallint

mediumint

bigint

unsigned big int

int2

int8

integer

1character(20)

varchar(255)

varying character(255)

nchar(55)

native character(70)

nvarchar(100)

text

clob

text

2blob

none

3real

double

double precision

float

real

4numeric

decimal(10,5)

boolean

date

datetime

numeric

5注:在sqlite中,型別varchar(255)的長度資訊255沒有任何實際意義,僅僅是為了保證與其它資料庫的宣告一致性。

三、比較表示式:

在sqlite3中支援的比較表示式有:"=", "==", "<", "<=", ">", ">=", "!=", "<>", "in", "not in", "between", "is" and "is not"。

資料的比較結果主要依賴於運算元的儲存方式,其規則為:

1). 儲存方式為null的數值小於其它儲存型別的值。

2). 儲存方式為integer和real的數值小於text或blob型別的值,如果同為integer或real,則基於數值規則進行比較。

3). 儲存方式為text的數值小於blob型別的值,如果同為text,則基於文字規則(ascii值)進行比較。

4). 如果是兩個blob型別的數值進行比較,其結果為c執行時函式memcmp()的結果。

四、操作符:

所有的數學操作符(+, -, *, /, %, <<, >>, &, and |)在執行之前都會先將運算元轉換為numeric儲存型別,即使在轉換過程中可能會造成資料資訊的丟失。此外,如果其中乙個運算元為null,那麼它們的結果亦為null。在數學操作符中,如果其中乙個運算元看上去並不像數值型別,那麼它們結果為0或0.0。

SQLite學習手冊 資料型別

一 儲存種類和資料型別 sqlite將資料值的儲存劃分為以下幾種儲存型別 null 表示該值為null值。integer 無符號整型值。real 浮點值。text 文字字串,儲存使用的編碼方式為utf 8 utf 16be utf 16le。blob 儲存blob資料,該型別資料和輸入資料完全相同。...

SQLite學習手冊 資料型別

一 儲存種類和資料型別 sqlite將資料值的儲存劃分為以下幾種儲存型別 null 表示該值為null值。integer 無符號整型值。real 浮點值。text 文字字串,儲存使用的編碼方式為utf 8 utf 16be utf 16le。blob 儲存blob資料,該型別資料和輸入資料完全相同。...

SQLite學習手冊 資料庫和事務

一 attach資料庫 attach database語句新增另外乙個資料庫檔案到當前的連線中,如果檔名為 memory 我們可以將其視為記憶體資料庫,記憶體資料庫無法持久化到磁碟檔案上。如果操作attached資料庫中的表,則需要在表名前加資料庫名,如dbname.table name。最後需要說...