如果sqlite是無類型的,那麼爲什麼我們要聲明列的數據類型? declare數據類型有什麼用?SQLite是無類型的?
Why android SQLite can store double value(java 8 bytes) into float column
如果sqlite是無類型的,那麼爲什麼我們要聲明列的數據類型? declare數據類型有什麼用?SQLite是無類型的?
Why android SQLite can store double value(java 8 bytes) into float column
它用於確定列的「親和力」。
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')]
聲明的列的數據類型被用作一個提示(http://sqlite.org/faq.html#q3):
因此,例如,如果列是INTEGER類型,並且您嘗試向該列中插入字符串,SQLite將嘗試將該字符串轉換爲整數。如果可以,它會插入整數。如果不是,則插入字符串。此功能稱爲類型關聯。
順便說一句,SQLite不是無類型的;它使用動態類型。這意味着您插入的任何值都會維護其自己的類型信息,而不是從表聲明中推斷該類型。 http://sqlite.org/datatype3.html
查閱文檔。 http://sqlite.org/datatype3.html
爲了最大化兼容性SQLite和其他數據庫 引擎之間,SQLite支持的列「類型親和力」的概念。 列中的類型親和性是該列中存儲的數據 的推薦類型。這裏的重要想法是,推薦使用 ,不要求使用。任何列仍可以存儲任何類型的 數據。只是有些列在給出選擇的情況下會更喜歡 使用一個存儲類而不是另一個。 列的首選存儲類稱爲其「親和性」。
看起來他們試圖保持與其他DBMS的兼容性。
此外,他們希望能夠做到以下幾點:
...小,沒有小數部分的浮點值,並存儲在 列與真正的親和力被寫入磁盤爲整數,以 佔用較少的空間,並自動轉換回浮動 點作爲值讀出。
最終,列的相似性由列的聲明類型決定,所以這就是爲什麼您要聲明列的類型。
他們還[證明它是一個錯配](http://www.sqlite.org/datatypes.html),然後基本承認他們是錯誤的,因爲他們以後添加文本和數字類型! – Timmmm 2012-09-17 13:49:54