区别于;“文本”;及;“字符串”;SQLite中的数据类型

区别于;“文本”;及;“字符串”;SQLite中的数据类型,sqlite,Sqlite,我有一个SQLite数据库和我的Android应用程序。我注意到我无意中使用“字符串”数据类型而不是“文本”数据类型定义了一个表。以下是带有字符串的代码: private final String LISTDATES_CREATE = "create table if not exists ListDates (_id integer primary key autoincrement, ListName string not null, UpdateDate string not null);

我有一个SQLite数据库和我的Android应用程序。我注意到我无意中使用“字符串”数据类型而不是“文本”数据类型定义了一个表。以下是带有字符串的代码:

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中“字符串”数据类型的任何引用。通常,所有字符串类型数据都使用“文本”定义,如下所示:


所以我的问题是,用“字符串”数据类型定义的字段与用“文本”数据类型定义的字段有什么区别?有区别吗?如果是这样,使用其中一个会产生什么后果(如果有的话)?

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

要了解这两个SQL语句之间的差异,请查看部分,该部分将您提供的列类型映射到SQLite使用的存储类

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

作为另一个示例,您可以定义一个类型为
interest STUFF
的列,该列将通过规则1映射到
INTEGER
存储类


总的来说,在表定义中使用
text
可能是一个好主意。

这是一个老问题,但我想强调字符串和文本列类型之间的具体区别。如果字符串看起来像一个数值,字符串将把它转换成一个数值,而文本将不执行任何转换

e、 g

将输出具有以下值的行:

 myint mystring mytext
   110      220   0330
  -110     -220  -0330
   110      220  +0330
 x0110    x0220  x0330
    11       22  033.0

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

感谢您的回复。一旦我发现了错误,我就进行了更改,但不幸的是,我在生产中使用了带有此错误的代码。既然这似乎不是什么大问题,我就让他们自然衰老。这真是个好消息。非常感谢。
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