boolean
列の型については知っていますが、SQLiteにboolean
リテラルはありますか?他の言語では、これはまたはである可能性がありtrue
ますfalse
。もちろん、とを使用することはできます0
が1
、可能な限り、いわゆる「マジックナンバー」を避ける傾向があります。
このリストから、他のSQL実装には存在する可能性がありますが、SQLiteには存在しないようです。(私はSQLite 3.6.10を使用していますが、その価値はあります。)
セクション1.1ドキュメントのブールデータ型から:
SQLiteには個別のブール型ストレージクラスはありません。代わりに、ブール値は整数0(false)および1(true)として格納されます。
0
だから、あなたはとで立ち往生しているように見えます1
。
SQLiteにブールリテラルはありますか?
Justin Ethierの回答で述べられているように、SQLiteにはブール値の特定のデータ型はありません。しかし、SQLite 3.23.0以降では、true/falseリテラルをサポートしています。
TRUEとFALSEを定数として認識します。(互換性のために、「true」または「false」という名前の列が存在する場合、識別子はブール定数ではなく列を参照します。)
サポート演算子は、TRUE、FALSE、TRUEではなく、FALSEではありません。
SELECT true AS t, false AS f;
SELECT 'condition is true'
WHERE 1 IS NOT FALSE;
CREATE TABLE a (id INT, b BOOLEAN DEFAULT(TRUE));
INSERT INTO a(id) VALUES(100);
SELECT * FROM a;
-- id b
-- 100 1
SELECT * FROM a WHERE true;
-- id b
-- 100 1
1.1ブールデータ型
SQLiteには個別のブール型ストレージクラスはありません。代わりに、ブール値は整数0(false)および1(true)として格納されます。
問題は、明示的に列タイプ(つまり、ストレージ単位)ではなく、PostgreSQLキーワードのドキュメント(SQL-92、SQLも含まれる)に従ってSQLに準拠するリテラル(つまり、パーサー単位)TRUE
の使用に関するものです。 :参照テーブルの2008およびSQL:2011列)。FALSE
SQLiteのドキュメントには、サポートされているすべてのキーワードがリストされています。このリストには、もも含まれていませTRUE
んFALSE
。したがって、SQLiteは、残念ながらその点で非準拠です。
また、簡単にテストして、トークンを列名にするためにパーサーがどのようにバーフするかを確認することもできます。
$ sqlite3 :memory:
SQLite version 3.14.0 2016-07-26 15:17:14
sqlite> CREATE TABLE foo (booleanish INT);
sqlite> INSERT INTO foo (booleanish) VALUES (TRUE);
Error: no such column: TRUE
他の誰もが指摘しているように、SQLiteは特定のブールストレージタイプをサポートしておらず、OPはこの事実を明確に認めています。ただし、これはSQLiteがブールリテラルと内包表記をサポートするかどうかとは完全に独立しています。
疑問に思っている人にとっては、答えは「はい」です。SQLite3.23以降、ブールリテラルTRUE
とを使用してブール値を理解できFALSE
、期待どおりに機能します。
たとえば、次のことができます。
SELECT * FROM blah WHERE some_column IS FALSE;
SELECT * FROM blah WHERE some_column IS TRUE;
0
そして、falseとtrueを使用している場合、期待どおりに機能1
します。
私のテストから、SQLiteがさまざまな値に一致する方法は次のとおりです。
IS TRUE
IS FALSE
IS NULL
。またはと一致しませIS TRUE
んIS FALSE
。IS FALSE
数値に解析されないTEXT:。「t」、「TRUE」、「true」、「True」などの値でも一致しますIS FALSE
ブールデータ型はありません。ここにリストされているのは5つのタイプだけです。整数は、さまざまな幅でディスクに格納できます。最小値は1バイトです。ただし、これは実装の詳細です。
「しかし、INTEGER値がディスクから読み取られて処理のためにメモリに読み込まれるとすぐに、それらは最も一般的なデータ型(8バイトの符号付き整数)に変換されます。」
それを考えると、ブールリテラルがないことは驚くべきことではありません。
BOOLEAN
テーブルを作成するときに使用できます。
sqlite3 :memory:
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> CREATE TABLE test (mybool BOOLEAN);
ただし、これは実際のデータ型ではなく、テーブルのSQL記述には次のようなものがあります。
"mybool" BOOLEAN NOT NULL CHECK(mybool IN(0,1))
基本的に、値が0または1であるSQL制約制約を作成します。したがって、TRUE / FALSEを使用すると、エラーが発生します。
sqlite> INSERT INTO test(mybool) VALUES (TRUE);
Error: no such column: TRUE
したがって、キーワードを使用できますがBOOLEAN
、「実際の」データ型ではないため、0/1を使用する必要があります。
sqlalchemyを使用する場合、データ型BOOLEANを問題なく使用できます。
SQLite3でサポートされているデータ型は5つだけです。
公式SQLite3ドキュメントから。「SQLiteデータベースに保存されている(またはデータベースエンジンによって操作されている)各値には、次のいずれかのストレージクラスがあります。
NULL. The value is a NULL value.
INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value."
1と0を保存する場合、SQLiteは保存時に1バイトを使用します。悪くないです。公式ドキュメントリンク:-http://www.sqlite.org/datatype3.html
sqlite for androidで、エラーなしでブール列型を宣言でき、正常に機能しているようです。また、列を「int」として定義し、Javaブール値を格納してみました。dbをダウンロードして、列に「true」と書いていることを確認しました。私はそれがうまくいくと思います。
ここに示すように、SQLiteにはTRUEとFALSEのリテラルがあります:
https://www.sqlite.org/syntax/literal-value.html
(ええ、応答するのに長い時間がかかります:)
SQLiteにはブール型がないため、INTEGERを使用する必要があります。0はfalse、1はtrueです。
BOOLEAN-> NUMERIC(アフィニティ)
カラムアフィニティ
SQLiteは、列の型アフィニティの概念をサポートしています。どの列でも任意のタイプのデータを格納できますが、列に推奨されるストレージクラスはアフィニティと呼ばれます。SQLite3データベースの各テーブル列には、次のタイプのアフィニティのいずれかが割り当てられます。アフィニティの説明
ブールデータ型:
SQLiteには個別のブール型ストレージクラスはありません。代わりに、ブール値は整数0(false)および1(true)として格納されます。
@ moiing-duck 「反対に、SQLiteはこれらの5つのタイプのいずれでもないにもかかわらず、日時をサポートしているため、この答えは決定的ではありません。」
SQLiteには、日付や時刻を保存するためのストレージクラスがありません。代わりに、SQLiteの組み込みの日付と時刻関数は、日付と時刻をTEXT、REAL、またはINTEGER値として格納できます。