我的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表定义可能是个好主意.
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)
这意味着将删除前导零,零尾随小数点和"数字"值上的加号.如果您打算使用从表中读取的值进行字符串匹配,这将导致问题.