SQLiteにブール値を格納する


回答:


365

SQLiteにはネイティブのブールデータ型はありません。データ型ドキュメントごと:

SQLiteには個別のブールストレージクラスはありません。代わりに、ブール値は整数0(false)および1(true)として格納されます。


24
"整数。値は符号付き整数であり、値の大きさに応じて1、2、3、4、6、または8バイトに格納されます。" BOOLを格納するために1バイトを使用することはそれほど悪くないと思います。
2009年

2
馬の口から直接:「SQLiteには別個のブールストレージクラスはありません。代わりに、ブール値は整数0(false)および1(true)として格納されます。」
Tobias、

3
パフォーマンスの点でどちらが優れていますか?文字列としてのtrue / falseまたは0/1整数?
Muhammad Babar

9
@MuhammadBabar 0/1間違いなく。文字列は遅く、より多くのスペースを必要とします。
Davor、2015

1
@joce実際には、整数0と1(およびNULL)は、行データ型宣言で直接エンコードされます。したがって、実際のデータストレージのみをカウントする場合、ブール値ごとに0バイトです。これは素晴らしいことです。ただし、ファイル形式で必要な列ごと、行ごとのブックキーピングを数えると、すべてのデータ型に余分なバイトが必要になりますが、これは素晴らしいことではありません。:)(参照:sqlite.org/fileformat.html#record_format
relative_random

93

SQLiteでは、整数0と1を使用してfalseとtrueを表すことができます。次のように列の型を宣言できます。

CREATE TABLE foo(mycolumn BOOLEAN NOT NULL CHECK (mycolumn IN (0,1)));

0と1に加えてNOT NULL許可する場合は、を省略しますNULL

BOOLEANここでの型名の使用は読みやすくするためです。SQLiteにとっては、NUMERICアフィニティを持つ型にすぎません。

SQLite 3.3.0(2006)以降、CHECK制約がサポートされていることに注意してください。

以下は、機能するINSERTの例です(文字列と浮動小数点数が整数として解析される方法に注意してください)。

sqlite> INSERT INTO foo VALUES(0);
sqlite> INSERT INTO foo VALUES(1);
sqlite> INSERT INTO foo VALUES(0.0);
sqlite> INSERT INTO foo VALUES(1.0);
sqlite> INSERT INTO foo VALUES("0.0");
sqlite> INSERT INTO foo VALUES("1.0");
sqlite> select mycolumn, typeof(mycolumn) from foo;
0|integer
1|integer
0|integer
1|integer
0|integer
1|integer

失敗するもの:

sqlite> INSERT INTO foo VALUES("-1");
Error: constraint failed
sqlite> INSERT INTO foo VALUES(0.24);
Error: constraint failed
sqlite> INSERT INTO foo VALUES(100);
Error: constraint failed
sqlite> INSERT INTO foo VALUES(NULL);
Error: foo.mycolumn may not be NULL
sqlite> INSERT INTO foo VALUES("true");
Error: constraint failed
sqlite> INSERT INTO foo VALUES("false");
Error: constraint failed

86

SQLite ブールデータ型:
SQLiteには、別個のブールストレージクラスはありません。代わりに、ブール値は整数0(false)および1(true)として格納されます。

次の方法でブール値をintに変換できます。

int flag = (boolValue)? 1 : 0;

次のように、intをbooleanに戻すことができます。

 // Select COLUMN_NAME  values from db. 
 // This will be integer value, you can convert this int value back to Boolean as follows
Boolean flag2 = (intValue == 1)? true : false;

sqliteを探索したい場合ここにチュートリアルがあります。ここで
1つの回答を示しました。彼らのために働いています。


13
コードの最終行は、 "Boolean flag2 =(intValue == 1)"のようになります
cja

16
私はお勧めしますBoolean flag2 = (intValue != 0);
Hamzeh Soboh 2015

または、ブール値flag2 =(intValue> 0);
Efrain Sanjay Adhikary 2016


5

さらにエリクワの答え。CHECK制約は、TEXTデータ型を適用し、TRUEまたはFALSEのケース固有の値のみを許可することにより、疑似ブール列を有効にすることができます。

CREATE TABLE IF NOT EXISTS "boolean_test"
(
    "id" INTEGER PRIMARY KEY AUTOINCREMENT
,   "boolean" TEXT NOT NULL 
        CHECK( typeof("boolean") = "text" AND
               "boolean" IN ("TRUE","FALSE")
        )
);

INSERT INTO "boolean_test" ("boolean") VALUES ("TRUE");
INSERT INTO "boolean_test" ("boolean") VALUES ("FALSE");
INSERT INTO "boolean_test" ("boolean") VALUES ("TEST");

Error: CHECK constraint failed: boolean_test

INSERT INTO "boolean_test" ("boolean") VALUES ("true");

Error: CHECK constraint failed: boolean_test

INSERT INTO "boolean_test" ("boolean") VALUES ("false");

Error: CHECK constraint failed: boolean_test

INSERT INTO "boolean_test" ("boolean") VALUES (1);

Error: CHECK constraint failed: boolean_test

select * from boolean_test;

id  boolean
1   TRUE
2   FALSE

5

しかし、それらの多くを格納したい場合は、それらをビットシフトして、UNIXファイルのアクセス許可/モードのように、それらをすべて1つのintとして格納できます。

たとえばモード755の場合、各桁は異なるクラスのユーザー(所有者、グループ、パブリック)を参照します。各桁内で、4が読み取られ、2が書き込み、1が実行されるため、7はバイナリ111のようにそれらすべてすべてです。5が読み取られ、実行される101。独自のエンコード方式を構成します。

私は、Schedules DirectからTVスケジュールデータを格納するために何かを書いているだけで、バイナリフィールドまたはyes / noフィールドがあります。つまり、7ビット、つまり最大127の整数です。実際には1文字です。

私が今取り組んでいるものからのCの例。has()は、2番目の文字列が最初の文字列にある場合に1を返す関数です。inpは、この関数への入力文字列です。miscは、0に初期化された符号なしcharです。

if (has(inp,"sap='Spanish'") > 0)
  misc += 1;
if (has(inp,"stereo='true'") > 0)
  misc +=2;
if (has(inp,"ei='true'") > 0)
  misc +=4;
if (has(inp,"closeCaptioned='true'") > 0)
  misc += 8;
if (has(inp,"dolby=") > 0)
  misc += 16;
if (has(inp,"new='true'") > 0)
  misc += 32;
if (has(inp,"premier_finale='") > 0)
  misc += 64;
if (has(inp,"hdtv='true'") > 0)
  misc += 128;

したがって、1つの整数に7つのブール値を格納し、さらに多くの領域を確保しています。


この答えは、CSの観点から見ると心温まるものです。:)
varun

2

以下を使用して、上記の方程式を簡略化できます。

boolean flag = sqlInt != 0;

ブール値のint表現(sqlInt)が0(false)の場合、ブール値(フラグ)はfalseになり、それ以外の場合はtrueになります。

簡潔なコードは常に:)で作業するのに適しています


-4

これを行う別の方法は、TEXT列です。次に、データベースから値を保存/読み取る前/後に、ブール値と文字列の間でブール値を変換します。

例 あなたが持って"boolValue = true;いる

文字列に:

//convert to the string "TRUE"
string StringValue = boolValue.ToString;  

そしてブール値に戻ります:

//convert the string back to boolean
bool Boolvalue = Convert.ToBoolean(StringValue);

6
@Craig McMahonは代わりにIntegerを使用することを提案しています:素数はtrueを表し、非素数はfalseを表します
Berik

18
@Berikさん、非常に不快です。明白な解決策は、「TRUE」または「FALSE」という単語を画像上にレンダリングし、それをJPEGエンコードされたBLOBとしてデータベース行に保存することです。次に、単純な特徴抽出アルゴリズムを使用して値を読み戻すことができます。
クレイグマクマホン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.