我的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”数据类型之间的区别是什么?有区别吗?如果是这样,使用其中一个或哪一个会产生什么后果?
答案 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
这意味着将删除前导零,零尾随小数点和“数字”值上的加号。如果您打算使用从表中读取的值进行字符串匹配,这将导致问题。