SQLite數據類型(學習必備)

最近在學習android端的數據庫,如下知識點做爲備用~html

1、存儲種類和數據類型:

    SQLite將數據值的存儲劃分爲如下幾種存儲類型:
     NULL: 表示該值爲NULL值。
     INTEGER: 無符號整型值。
     REAL: 浮點值。
     TEXT: 文本字符串,存儲使用的編碼方式爲UTF-八、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到當前時間所流經的秒數。

2、類型親緣性:

    爲了最大化SQLite和其它數據庫引擎之間的數據類型兼容性,SQLite提出了"類型親緣性(Type Affinity)"的概念。咱們能夠這樣理解"類型親緣性 ",在表字段被聲明以後,SQLite都會根據該字段聲明時的類型爲其選擇一種親緣類型,當數據插入時,該字段的數據將會優先採用親緣類型做爲該值的存儲方式,除非親緣類型不匹配或沒法轉換當前數據到該親緣類型,這樣SQLite纔會考慮其它更適合該值的類型存儲該值。SQLite目前的版本支持如下五種親緣類型:android

親緣類型          描述  
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. 具體示例數據庫

聲明類型 親緣類型 應用規則
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沒有任何實際意義,僅僅是爲了保證與其它數據庫的聲明一致性。

3、比較表達式:

    在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()的結果。

4、操做符:

    全部的數學操做符(+, -, *, /, %, <<, >>, &, and |)在執行以前都會先將操做數轉換爲NUMERIC存儲類型,即便在轉換過程當中可能會形成數據信息的丟失。此外,若是其中一個操做數爲NULL,那麼它們的結果亦爲NULL。在數學操做符中,若是其中一個操做數看上去並不像數值類型,那麼它們結果爲0或0.0。函數

來自:http://www.cnblogs.com/stephen-liu74/archive/2012/01/18/2325258.html學習

相關文章
相關標籤/搜索