34

我的 Android 应用程序有一个 SQLite 数据库。我注意到我不小心使用“字符串”数据类型而不是“文本”数据类型定义了一个表。这是带有字符串的代码:

private final String LISTDATES_CREATE = "create table if not exists ListDates (_id integer primary key autoincrement, ListName string not null, UpdateDate string not null);";

这行得通。它从未抛出错误,我可以存储和检索数据。但是,我在文档或互联网上找不到对 SQLite 中“字符串”数据类型的任何引用。通常,所有字符串类型数据都使用“文本”定义,如下所示:

private final String LISTDATES_CREATE = "create table if not exists ListDates (_id integer primary key autoincrement, ListName text not null, UpdateDate text not null);";

所以我的问题是,用“字符串”数据类型定义的字段与“文本”数据类型定义的字段有什么区别?有区别吗?如果是这样,使用其中一种会产生什么后果(如果有的话)?

4

2 回答 2

41

这里需要注意的微妙之处是 SQLite 不强制您放入列中的值的数据类型。这意味着您可以将文本放入数字字段中,依此类推。

要了解您的两个 SQL 语句之间的区别,请查看第2.1 节确定列关联性,它将您提供的列类型映射到 SQLite 使用的存储类。

在这种情况下,类型通过规则 5string映射到存储类。在代码中声明该字段将告诉 DBMS 使用存储类。同样,由于 SQLite 不强制列的类型,您的代码在将字符串存储为列时可能会运行良好,正如您所注意到的。NUMERICtextTEXTNUMERIC

作为替代示例,您可以定义一个类型为 的列INTERESTING STUFF,并将INTEGER通过规则 1 映射到存储类。

总体而言,仅text用于表定义可能是个好主意。

于 2012-08-13T17:01:29.560 回答
38

这是一个老问题,但我想强调 STRING 和 TEXT 列类型之间的具体区别。如果字符串看起来像数值,则 STRING 会将其转换为数值,而 TEXT 不会执行任何转换。

例如

create table t1(myint INTEGER, mystring STRING, mytext TEXT);
insert into t1 values ('0110', '0220', '0330');
insert into t1 values ('-0110', '-0220', '-0330');
insert into t1 values ('+0110', '+0220', '+0330');
insert into t1 values ('x0110', 'x0220', 'x0330');
insert into t1 values ('011.0', '022.0', '033.0');
select * from t1

将输出具有值的行:

 myint mystring mytext
   110      220   0330
  -110     -220  -0330
   110      220  +0330
 x0110    x0220  x0330
    11       22  033.0

这意味着将去除“数字”值上的前导零、尾随小数点和加号。如果您打算使用从表中读出的值进行字符串匹配,这将导致问题。

于 2017-02-16T03:31:07.353 回答