34

AndroidアプリケーションにSQLiteデータベースがあります。「Text」データ型の代わりに「String」データ型を使用してテーブルを誤って定義したことに気づきました。文字列を含むコードは次のとおりです。

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の「文字列」データ型への参照を見つけることができません。通常、すべての文字列型データは、次のように「テキスト」で定義されます。

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

だから私の質問は、「文字列」データ型と「テキスト」データ型で定義されたフィールドの違いは何ですか?違いはありますか?もしそうなら、もしあれば、どちらか一方を使用した結果はどうなりますか?

4

2 に答える 2

41

ここで注意すべき微妙な点は、SQLiteは列に入力する値のデータ型を強制しないということです。つまり、数値フィールドなどにテキストを入力できるということです。

2つのSQLステートメントの違いを理解するには、セクション2.1列アフィニティの決定を確認してください。このセクションでは、提供する列タイプをSQLiteが使用するストレージクラスにマップします。

この場合、タイプはルール5を介しstringてストレージクラスにマップされます。コードのようにフィールドを宣言すると、DBMSにストレージクラスを使用するように指示されます。繰り返しになりますが、SQLiteは列のタイプを強制しないため、ご存知のように、文字列を列として格納するときにコードはおそらく正常に実行されます。NUMERICtextTEXTNUMERIC

別の例として、タイプが、ルール1を介してストレージクラスにINTERESTING STUFFマップされる列を定義できます。INTEGER

text全体として、テーブル定義にのみ使用することをお勧めします。

于 2012-08-13T17:01:29.560 に答える
38

これは古い質問ですが、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

これは、先行ゼロ、小数点以下のゼロ、および「数値」値のプラス記号が削除されることを意味します。これにより、テーブルから読み取った値を使用して文字列の照合を行う場合に問題が発生します。

于 2017-02-16T03:31:07.353 に答える