377 Stimmen

Booleschen Wert in SQLite speichern

Was ist der Typ für einen BOOL-Wert in SQLite? Ich möchte in meiner Tabelle TRUE/FALSE-Werte speichern.

Ich könnte eine INTEGER-Spalte erstellen und darin die Werte 0 oder 1 speichern, aber das wäre nicht der beste Weg, um den Typ BOOL zu implementieren.

Gibt es einen Weg?

456voto

Lasse V. Karlsen Punkte 364542

Es gibt keinen nativen booleschen Datentyp für SQLite. Gemäß der Datentypen doc :

SQLite verfügt nicht über eine separate Boolean-Speicherklasse. Stattdessen werden boolesche Werte als ganze Zahlen 0 (falsch) und 1 (wahr) gespeichert.

153voto

ericwa Punkte 1491

In SQLite können Sie bestenfalls die ganzen Zahlen 0 und 1 verwenden, um falsch und wahr darzustellen. Sie könnten den Spaltentyp wie folgt deklarieren:

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

Weglassen der NOT NULL wenn Sie Folgendes zulassen möchten NULL zusätzlich zu 0 und 1.

Die Verwendung des Typnamens BOOLEAN hier dient der Lesbarkeit, für SQLite ist es einfach ein Typ mit NUMERIC-Affinität .

Beachten Sie, dass CHECK-Einschränkungen werden unterstützt seit SQLite 3.3.0 (2006).

Hier sind einige INSERT-Beispiele, die funktionieren: (beachten Sie, dass Strings und Gleitkommazahlen als Ganzzahlen geparst werden)

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

und einige, die scheitern werden:

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

95voto

Muhammad Nabeel Arif Punkte 18842

SQLite Boolescher Datentyp:
SQLite verfügt nicht über eine separate Boolean-Speicherklasse. Stattdessen werden boolesche Werte als ganze Zahlen 0 (falsch) und 1 (wahr) gespeichert.

Auf diese Weise können Sie boolean in int konvertieren:

int flag = (boolValue)? 1 : 0;

Sie können int wie folgt wieder in boolean umwandeln:

 // 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;

Wenn Sie sqlite erforschen wollen, hier ist eine Anleitung .
Ich habe eine Antwort gegeben aquí . Es funktioniert für sie.

9voto

Die Verwendung des Datentyps Integer mit den Werten 0 und 1 ist am schnellsten.

6voto

Alan Corey Punkte 479

Aber, wenn Sie ein Bündel von ihnen speichern möchten, könnten Sie sie bit-shiften und sie alle als ein int speichern, ein wenig wie Unix-Dateiberechtigungen/Modi.

Im Modus 755 zum Beispiel bezieht sich jede Ziffer auf eine andere Benutzerklasse: Eigentümer, Gruppe, öffentlich. Innerhalb jeder Ziffer steht 4 für Lesen, 2 für Schreiben, 1 für Ausführen, so dass 7 für alle steht, wie binär 111. 5 ist Lesen und Ausführen, also 101. Denken Sie sich Ihr eigenes Kodierungsschema aus.

Ich schreibe gerade etwas für die Speicherung von TV-Programmdaten von Schedules Direct und ich habe die binären oder Ja/Nein-Felder: Stereo, hdtv, neu, ei, mit Untertiteln, Dolby, sap in Spanisch, Staffelpremiere. Also 7 Bits oder eine ganze Zahl mit einem Maximum von 127. Eigentlich nur ein Zeichen.

Ein C-Beispiel von dem, woran ich gerade arbeite. has() ist eine Funktion, die 1 zurückgibt, wenn die zweite Zeichenkette in der ersten enthalten ist. inp ist die Eingabezeichenkette für diese Funktion. misc ist ein unsigned char, das auf 0 initialisiert ist.

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;

Ich speichere also 7 Boolesche Werte in einer Ganzzahl mit Platz für weitere.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X