SQLite或JDBC奇怪的行为

时间:2015-11-08 21:08:25

标签: java jdbc sqlite

我在数据库中有一个简单的版本表。这是DDL:

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'丢失。

所以,问题是:它为什么会发生以及如何解决它?

1 个答案:

答案 0 :(得分:2)

STRING不是SQLite数据类型,因此列current默认为NUMERIC亲缘关系,并尝试将插入其中的内容转换为数字。将STRING更改为TEXT,该列会将您的数据保留为字符串。

Datatypes in SQLite3文档页面提供了更深入的解释:

  

列的亲和力由声明的类型决定   列,按照以下规则显示顺序:

     

如果声明的类型包含字符串" INT"然后它被分配   INTEGER亲和力。

     

如果声明的列类型包含任何字符串" CHAR",   " CLOB",或" TEXT"然后该列具有TEXT亲和力。请注意   type VARCHAR包含字符串" CHAR"因此分配了TEXT   亲和力。

     

如果列的声明类型包含字符串" BLOB"或者如果没有   指定了类型,然后该列具有关联BLOB。

     

如果列的声明类型包含任何字符串" REAL",   " FLOA",或" DOUB"该列具有REAL亲和力。

     

否则,亲和力为NUMERIC。