SQLite中“Text”和“String”数据类型的区别

时间:2012-08-13 16:28:45

标签: sqlite

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

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

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

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

所以我的问题是,使用“string”数据类型定义的字段与“text”数据类型之间的区别是什么?有区别吗?如果是这样,使用其中一个或哪一个会产生什么后果?

2 个答案:

答案 0 :(得分:29)

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

要了解两个SQL语句之间的区别,请查看2.1 Determination Of Column Affinity部分,它将您提供的列类型映射到SQLite使用的存储类。

在这种情况下,类型string通过规则5映射到存储类NUMERIC。在代码中将字段声明为text将告诉DBMS使用{{1}存储类。同样,由于SQLite不强制执行列类型,因此在将字符串存储为TEXT列时,您的代码可能会正常运行,如您所述。

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

总的来说,将INTEGER用于表定义可能是个好主意。

答案 1 :(得分:11)

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

e.g。

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

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