親緣類型 | 描述 |
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 | 不做任何的轉換,直接以該數據所屬的數據類型進行存儲?! ?/td> |
1. 決定字段親緣性的規則:
字段的親緣性是根據該字段在聲明時被定義的類型來決定的,具體的規則可以參照以下列表。需要注意的是以下列表的順序,即如果某一字段類型同時符合兩種親緣性,那么排在前面的規則將先產生作用。
1). 如果類型字符串中包含"INT",那么該字段的親緣類型是INTEGER。
2). 如果類型字符串中包含"CHAR"、"CLOB"或"TEXT",那么該字段的親緣類型是TEXT,如VARCHAR。
3). 如果類型字符串中包含"BLOB",那么該字段的親緣類型是NONE。
4). 如果類型字符串中包含"REAL"、"FLOA"或"DOUB",那么該字段的親緣類型是REAL。
5). 其余情況下,字段的親緣類型為NUMERIC。
2. 具體示例:
聲明類型 | 親緣類型 | 應用規則 |
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沒有任何實際意義,僅僅是為了保證與其它數據庫的聲明一致性。
三、比較表達式:
在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。