2012-08-13 212 views
16

我的Android应用程序有一个SQLite数据库。我注意到我意外地使用“字符串”数据类型而不是“文本”数据类型定义了一个表。以下是带字符串的代码: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);"; 

This works。它从来没有抛出错误,我可以存储和检索数据。但是,我无法在文档或Internet上找到对SQLite中“String”数据类型的任何引用。通常情况下,所有的字符串类型的数据被定义为“文本”,像这样:

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

所以我的问题是,什么是一个“字符串”数据类型与“文本”数据类型定义的字段之间的区别?有区别吗?如果是这样,使用其中一种或另一种的后果如何?

回答

26

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

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

在这种情况下,类型string被通过规则5.声明领域,如代码会告诉DBMS使用TEXT存储类text映射到存储类NUMERIC。同样,由于SQLite没有强制使用列的类型,所以当您将字符串存储为NUMERIC列时,您的代码可能会正常运行,正如您所注意的那样。

作为替代例如,您可以定义与INTERESTING STUFF类型的列,这将通过规则映射到INTEGER存储类,1

总体而言,它可能只使用text一个好主意,你的桌定义。

+2

谢谢你的回应。一旦我发现了这个错误,我做出了改变,但是不幸的是我有这个错误在生产中出现了代码。既然它看起来不是什么大问题,我只会让它们自然老化。这是非常棒的信息。谢谢! – 2012-08-13 19:39:38

4

这是一个老问题,但我想强调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 

这意味着前导零,零拖尾小数点和再加上“数字”值符号将被剥离。如果打算使用从表格中读出的值进行字符串匹配,这会造成问题。

相关问题