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

Mic*_*ner 21 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);";
Run Code Online (Sandbox Code Playgroud)

这有效.它从未抛出错误,我可以存储和检索数据.但是,我无法在文档或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);";
Run Code Online (Sandbox Code Playgroud)

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

wsa*_*lle 30

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

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

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

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

总的来说,使用text表定义可能是个好主意.

  • 感谢您的答复.一旦我发现了这个错误,我就做了改变,但遗憾的是我生产了这个错误代码.由于它似乎不是一个主要问题,我只是让它们自然衰老.这真是一个很好的信息.谢谢! (2认同)

Phi*_*gan 13

这是一个老问题,但我想强调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
Run Code Online (Sandbox Code Playgroud)

将输出具有值的行:

 myint mystring mytext
   110      220   0330
  -110     -220  -0330
   110      220  +0330
 x0110    x0220  x0330
    11       22  033.0
Run Code Online (Sandbox Code Playgroud)

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