。SQLite使用動態類型系統,在SQLite中,值的資料類型和值本身,而不是和它的容器,關聯在一起的。SQLite的動態類型系統和其他資料庫引擎的靜態類型系統是相容的,這樣在靜態類型的資料庫上執行的SQL語句也可以在SQLite中執行。
1.0 儲存類和資料類型
每個儲存在SQLite資料庫中(或被資料庫引擎操縱的)的值都有下列儲存類的一個:
- NULL。空值。
- INTEGER。有符號整數,儲存在1、2、3、4、6或8個位元組中。
- REAL。浮點數,儲存為8位元組的IEEE浮點數。
- TEXT。文本串,使用資料庫編碼(UTF-8, UTF-16BE或UTF-16LE)儲存。
- BLOB。大塊資料。
注意儲存類(storage class)比資料類型更一般。INTEGER儲存類,例如,包含6種長度不同的整數資料類型。這在磁碟中是有區別的。不過一旦INTEGER值從磁碟讀到內容中進行處理的時候,這些值會轉化為更普通的資料類型(8位有符號整數)。因此在大部分情況下,儲存類和資料類型是不易分辨的,這兩個術語可以交換使用。
在SQLite 3 資料庫中,任何列,除了INTEGER PRIMARY KEY列,都可以儲存任何儲存類的值。
SQL語句中的所有值,不管是SQL語句中嵌入的字面值,還是先行編譯的SQL語句中的參數,都有一個隱式的儲存類。在下面描述的條件下,在查詢執行階段,資料庫引擎可能會在數字儲存類(INTEGER和REAL)和TEXT儲存類之間轉換。
1.1 Boolean資料類型
SQLite沒有單獨的Boolean儲存類,相反,Booean值以整數0(false)和1(true)儲存。
1.2 日期和時間資料類型
SQLite沒有為儲存日期和/或時間設定專門的儲存類,相反,內建的日期和時間函數能夠把日期和時間作為TEXT,REAL或INTEGER值儲存:
- TEXT:作為ISO8601字串("YYYY-MM-DD HH:MM:SS.SSS")。
- REAL:作為Julian天數,……
- INTEGER:作為Unix Time,即自1970-01-01 00:00:00 UTC以下的秒數。
2.0 類型相像(type affinity)
為了最大化SQLite和其他資料庫引擎之間的相容性,SQLite支援列的”類型相像“的概念。這裡重要的思想是,類型是推薦的,不是必需的。任何列仍然能夠儲存任何類型的資料。只是某些列,能夠選擇優先使用某種儲存類。這個對列的優先儲存類稱作它的”相像“。
SQLite 3 資料庫中的每個列都賦予下面類型相像中的一個:
- TEXT
- NUMERIC
- INTEGER
- REAL
- NONE
帶有TEXT相像的列會使用儲存類NULL、TEXT或BLOB來儲存所有的資料。如果資料資料被插入到帶有TEXT相像的列中,它會在插入前轉換為文字格式設定。
帶有NUMERIC相像的列可以使用所有5個儲存類來包含值。當文本資料被插入到一個NUMERIC列,文本的儲存類會被轉換成INTEGER或REAL(為了優先),如果這個轉換是無損的和可逆的話。如果TEXT到INTEGER或REAL的轉換是不可能的,那麼值會使用TEXT儲存類儲存。不會試圖轉換NULL或BLOB值。
……
2.1 列相像的確定
列相像是由列聲明的類型確定的,規則是按照下面的順序:
1. 如果聲明的類型包含字串”INT“那麼它被賦予INTEGER相像。
2. 如果列聲明的類型包含任何字串”CHAR“,”CLOB“,或”TEXT“,那麼此列擁有TEXT相像。注意類型VARCHAR包含”CHAR“,因此也會賦予TEXT相像。
3. 如果列聲明的類型包含”BLOB“或沒有指定類型,那麼此列擁有NONE相像。
4. 如果列聲明的類型包含任何”REAL“,”FLOA“,或”DOUB“,那麼此列擁有REAL相像。
5. 其他情況,相像是NUMERIC。
注意規則的順序是重要的。宣告類型為“CHARINT”的列同時匹配規則1和規則2,但第一個規則會優先採用,因此此列的相像是INTEGER。
2.2 相像樣本
樣本 |
相像結果 |
規則 |
INT INTEGER TINYINT SMALLINT MEDIUMINT BIGINT UNSIGNED BIG INT INT2 INT8 |
INETGER |
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 |
注意“FLOATING POINT”類型會指定INTEGER相像,而不是REAL相像,因為”INT“在末尾。”STRING“類型會擁有NUMERIC相像,而不是TEXT。