SQLite 數據類型總結
1。嚴格地說,SQLite 沒有數據類型。SQLite 使用動態數據類型,即:數據的類型取決於數據本身,而不是它的容器(字段)
2。存儲類型(Storage Class):數據保存到文件后的表現形式。包括:
- NULL - 空值
- INTERGER - 有符號整數類型
- REAL - 浮點數類型
- TEXT - 字符串(其編碼取決於DB的編碼)
- BLOB - 二進制表示
3。親和類型(Type Affinity):數據表的列中的數據對Storage Class的傾向性
- TEXT
- NUMERIC
- INTEGER
- REAL
- NONE
4。聲明類型(Declared Type):CREATE TABLE/ALTER TABLE 語句中聲明的列的類型
Declared Type、Type Affinity、Storage Class 之間的關系:
Declared Type | Type Affinity | Storage Class(按優先級) |
INT | INTERGER | (同NUMERIC) |
CHAR TEXT |
TEXT | TEXT/NULL/BLOB |
BLOB (不指定) |
NONE | (As is) |
REAL FLOAT DOUBLE |
REAL | (同NUMERIC) |
(其它) | NUMERIC | INTEGER/REAL/TEXT/NULL/BLOB |
例外:
(1)BLOB 數據始終保存為 BLOB 的 Storage Class
5。數據的比較。比較操作符(=,>,>=...)、IN、Sort by等,按照以下5個步驟比較左右操作數:
- Step 1:根據下列規則確定左右操作數的 Type Affinity:
- 列名表達式 - 該列的 Affinity(見前面第4節表格第2列)
- CAST ... AS ... - 所指定的 Affinity(見前面第4節表格第2列)
- 其他情況 - NONE Affinity
- Step 2:Type Affinity 轉換。如果左、右操作數都是下列 3 種 Type Affinity 之一,則按照下列優先順序,將低優先級的轉換為高優先級的:
- 數值類(INTEGER/REAL/NUMERIC)
- TEXT
- NONE
- Step 3:由 Type Affinity 及數據的實際類型,確定其 Storage Class(見前面第4節表格第3列)
- Step 4:如果左、右操作數屬於不同的 Storage Class,則按照以下順序(由小到大)確定比較結果:
- NULL
- 數值類(INTEGER/REAL)
- TEXT
- BLOB
- Step 5:如果左、右操作數屬於相同的 Storage Class,則根據以下規則進行比較
- NULL - 左值始終小於右值
- 數值類(INTEGER/REAL)- 按數值比較
- TEXT - 逐字符比較
- BLOB - 用 memcmp() 函數比較