2012-03-21 33 views

回答

2

它用於確定列的「親和力」。

CREATE TABLE Example (
    IntegerAffinity INTEGER, 
    RealAffinitity  REAL, 
    NumericAffinity NUMERIC, 
    TextAffinity  TEXT, 
    NoAffinity 
); 

插入一些值此表(與Python的sqlite3模塊)給出):

>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [1234] * 5) 
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", ['1234'] * 5) 
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [math.pi] * 5) 
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [str(math.pi)] * 5) 
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", ['ABC'] * 5) 
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [b'5678'] * 5) 
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [b'\xAB\xCD\xEF'] * 5) 
>>> list(db.execute("SELECT * FROM Example")) 
[(1234, 1234.0, 1234, '1234', 1234), 
(1234, 1234.0, 1234, '1234', '1234'), 
(3.141592653589793, 3.141592653589793, 3.141592653589793, '3.14159265358979', 3.141592653589793), 
(3.141592653589793, 3.141592653589793, 3.141592653589793, '3.141592653589793', '3.141592653589793'), 
('ABC', 'ABC', 'ABC', 'ABC', 'ABC'), 
(b'5678', b'5678', b'5678', b'5678', b'5678'), 
(b'\xab\xcd\xef', b'\xab\xcd\xef', b'\xab\xcd\xef', b'\xab\xcd\xef', b'\xab\xcd\xef')] 
  • 在文本的親和柱,得到的數字轉換爲字符串。
  • 在整數,實數和數字親和性列中,包含數字的字符串會轉換爲數字。
  • 不包含數字的字符串仍保留字符串,即使在數字列中也是如此。
  • 無論列的親和性如何,Blob都會保留斑點。
  • 在無親和性的列中,值按原樣插入。
3

聲明的列的數據類型被用作一個提示(http://sqlite.org/faq.html#q3):

因此,例如,如果列是INTEGER類型,並且您嘗試向該列中插入字符串,SQLite將嘗試將該字符串轉換爲整數。如果可以,它會插入整數。如果不是,則插入字符串。此功能稱爲類型關聯。

順便說一句,SQLite不是無類型的;它使用動態類型。這意味着您插入的任何值都會維護其自己的類型信息,而不是從表聲明中推斷該類型。 http://sqlite.org/datatype3.html

1

查閱文檔。 http://sqlite.org/datatype3.html

爲了最大化兼容性SQLite和其他數據庫 引擎之間,SQLite支持的列「類型親和力」的概念。 列中的類型親和性是該列中存儲的數據 的推薦類型。這裏的重要想法是,推薦使用 ,不要求使用。任何列仍可以存儲任何類型的 數據。只是有些列在給出選擇的情況下會更喜歡 使用一個存儲類而不是另一個。 列的首選存儲類稱爲其「親和性」。

看起來他們試圖保持與其他DBMS的兼容性。

此外,他們希望能夠做到以下幾點:

...小,沒有小數部分的浮點值,並存儲在 列與真正的親和力被寫入磁盤爲整數,以 佔用較少的空間,並自動轉換回浮動 點作爲值讀出。

最終,列的相似性由列的聲明類型決定,所以這就是爲什麼您要聲明列的類型。

+0

他們還[證明它是一個錯配](http://www.sqlite.org/datatypes.html),然後基本承認他們是錯誤的,因爲他們以後添加文本和數字類型! – Timmmm 2012-09-17 13:49:54