2015-11-08 58 views
1

我在數據庫中有一個簡單的版本表。這裏是DDL:SQLite或JDBC奇怪的行爲

CREATE TABLE version (current STRING NOT NULL); 
INSERT INTO version (current) VALUES ("1.0"); 

在這張表中只存儲了一行與當前的數據庫結構版本。在第一次臉紅一切都很好,但這裏有一點奇怪的東西:

//... connect to SQLite and another stuff... 
ResultSet resultSet = statement.executeQuery("select current from version;"); 
if(!resultSet.next()) 
    throw new SQLException("Corrupted version table! Aborting..."); 
String versionStr = resultSet.getString(1); 
System.out.println("Version string: '" + versionStr + "'"); 
//... close statement, blah-blah-blah 

輸出是:'1'。 '.0'錯過了什麼地方?如果當前值爲'0.1','1.3'且小數部分不爲零 - 一切都很好。由於它零 - 「.0」丟失。

所以,問題是:爲什麼會發生,以及如何解決它?

回答

2

STRING不是SQLite數據類型,所以列current默認爲NUMERIC親和力,並嘗試將已插入的內容轉換爲數字。將STRING更改爲TEXT,該列會將您的數據保留爲字符串。

Datatypes in SQLite3文檔頁面給出了更深入的解釋:

通過聲明的類型的 柱所確定的列的親和性,按照所示順序的以下規則:

如果聲明的類型包含字符串「INT」,則它被分配爲 INTEGER親和性。

如果列的聲明類型包含任何字符串「CHAR」, 「CLOB」或「TEXT」,那麼該列具有TEXT關聯。請注意, 類型的VARCHAR包含字符串「CHAR」,因此被指定爲TEXT 親和力。

如果某個列的聲明類型包含字符串「BLOB」,或者沒有指定類型,則該列具有親和性BLOB。

如果列的聲明類型包含任何字符串「REAL」, 「FLOA」或「DOUB」,則該列具有REAL親和性。

否則,親和力是NUMERIC。

+0

「否則,親和力是NUMERIC。」,yeap。謝謝,我錯過了它。 – Ivan