2010-08-02 138 views
18

我在Zentus的Java應用程序中使用SQLite。在這種情況下,我需要保存並查詢我的數據庫中的Java long值。從其他RDBMS編輯我創建的表如下存儲長值:SQLite數據類型

CREATE TABLE myTable (id INTEGER PRIMARY_KEY, longValue LONG) 

該溶液產生例外的行爲,但閱讀了SQLite documentation on data types後予理解的是,我的LONG類型具有比使用TEXT =>longValue是一樣的效果以文本形式存儲。

然後我決定將其更改爲INTEGER(該長度是可變的,並且可以存儲多達64位整數,這是Java long的長度),以便具有更簡潔的代碼,並且可以節省一些磁盤空間並增加因爲我的longValues被插入並被詢問爲long

比較創建的數據庫,我不能看到任何區別的性能和尺寸後:

CREATE TABLE myTable (id INTEGER PRIMARY_KEY, longValue LONG) 

CREATE TABLE myTable (id INTEGER PRIMARY_KEY, longValue INTEGER) 

關於這個問題的任何意見,經驗或感受?

回答

22

在SQLite中,數據類型是按值而不是按列。所以當你插入整數時,它們被存儲爲整數,而不管列的類型如何。

+4

因此,我想知道:爲什麼列類型存在? – 2010-08-02 13:26:04

+9

列有「親和力」;例如,傳遞數字字符串的文本列應將其存儲爲文本,並保留格式(小數位等)。 雖然傳遞數字字符串的數字列會在將其存儲之前將其轉換爲數字,因此「10.00」稍後將返回爲「10」。 由於LONG列具有默認數值親和力,因此將類型更改爲INTEGER不會更改任何內容。 – 2010-08-02 13:30:48

+3

SQlite網站的答案是:「爲了最大限度地提高SQLite與其他數據庫引擎的兼容性,SQLite支持列上的」類型親和性「概念。列的類型親和性是存儲在該列中的數據的推薦類型。這裏的重要思想是這個類型是推薦的,不是必需的,任何列都可以存儲任何類型的數據,只是有些列在給出選擇的情況下會傾向於使用一個存儲類而不是另一個「但是什麼」更喜歡「意味着??對性能和數據庫大小有沒有影響? – 2010-08-02 13:31:20

7

SQLite自動選擇合適的大小。從http://www.sqlite.org/datatype3.html

INTEGER。該值是一個有符號整數,根據值的大小存儲在1,2,3,4,6或8個字節 中。

SQLite使用動態類型,並且是無模式的。

+0

感謝您快速回答Christian。我已經讀過了,這就是爲什麼我認爲INTEGER的數據庫大小比使用LONG的數據庫大小要小的原因,因爲編碼長文本(我認爲是utf8)應該比使用可變長度整數更昂貴。不是嗎?我如何解釋2個數據庫的大小相同? – 2010-08-02 13:24:49

+0

當然,NoSQL數據庫(鍵/值)系統的含義不是「無模式」。我給的第一個鏈接和http://www.sqlite。org/different.html解釋了輸入的更多細節。 – 2010-08-02 13:55:44

7

看錶演和大小後,創建的數據庫的 我不能 看到任何區別:

沒有任何區別。 INTEGER具有整數關聯性,LONG具有數字關聯性。而且,http://www.sqlite.org/datatype3.html說:

使用INTEGER親和 A柱相同的行爲與 NUMERIC關聯的列。 INTEGER和NUMERIC親和力 之間的差異 僅在CAST表達式中很明顯。

+0

您的意思是說,在演員陣營中,數字就像「浮點型」一樣運作? – Pacerier 2011-11-11 22:13:14

2
CREATE TABLE ex2(
    a VARCHAR(10), 
    b NVARCHAR(15), 
    c TEXT, 
    d INTEGER, 
    e FLOAT, 
    f BOOLEAN, 
    g CLOB, 
    h BLOB, 
    i TIMESTAMP, 
    j NUMERIC(10,5) 
    k VARYING CHARACTER (24), 
    l NATIONAL VARYING CHARACTER(16) 
);