我在数据库中有一个简单的版本表。这是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'丢失。
所以,问题是:它为什么会发生以及如何解决它?
答案 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。