HOWTO · SQLite
Boolescher Datentyp in der SQLite-Datenbank
Erfahren Sie mehr über den booleschen Datentyp in der SQLite-Datenbank.
Auf dieser Seite
SQLite besitzt keine eigene Boolean-Speicherklasse. Boolean-Werte lassen sich dennoch darstellen: Üblicherweise wird 0 für falsch und 1 für wahr in einer Ganzzahlspalte gespeichert. Eine einheitliche Textkonvention ist eine weitere Möglichkeit, wenn sie zur Anwendung oder zu einer Schnittstelle passt, mit der Daten ausgetauscht werden.
Boolean-Datentyp in der SQLite-Datenbank
SQLite besitzt keine native Boolean-Speicherklasse. Wählen Sie eine Darstellung und verwenden Sie sie einheitlich im Schema, in den eingefügten Werten und in Abfragen. Ganzzahlen sind die praktische Standardwahl. Eine CHECK-Bedingung kann eine Spalte auf die vorgesehenen zwei Zustände beschränken, denn der deklarierte Typ allein stellt das nicht sicher.
Boolesche Werte als Ganzzahlen darstellen
Bei einem Merkmal mit zwei möglichen Zuständen steht nach der Ganzzahlkonvention 0 für falsch und 1 für wahr. Deklarieren Sie die Spalte als INTEGER, damit ihr Zweck klar ist, und ergänzen Sie dann CHECK (flag IN (0, 1)), um die gespeicherten Werte auf diese beiden Möglichkeiten zu beschränken. SQLite verwendet eine flexible Typisierung; die Deklaration allein garantiert daher nicht, dass jeder gespeicherte Wert einer davon entspricht. Die Bedingung legt die Regel in der Datenbank fest, wo SQLite sie bei Einfügungen und Aktualisierungen durch jeden Client durchsetzt. Für diese Durchsetzung ist eine Grenze klar zu benennen: Ein CHECK-Ausdruck schlägt nur fehl, wenn er zu falsch ausgewertet wird. Da NULL IN (0, 1) zu NULL und nicht zu falsch ausgewertet wird, lässt die Bedingung allein NULL weiterhin zu; NULL fernzuhalten ist die separate Aufgabe von NOT NULL, die als Nächstes behandelt wird.
NOT NULL beantwortet eine andere Frage: Muss das Merkmal für jede Zeile einen Wert haben? Ohne diese Einschränkung kann eine Zeile NULL enthalten. Das bedeutet unbekannt oder nicht angegeben, nicht falsch. Verwenden Sie beide Einschränkungen, wenn jeder Datensatz eine eindeutige Antwort haben muss. Wenn die Anwendung absichtlich unbeantwortete Merkmale zulässt, lassen Sie NOT NULL weg und berücksichtigen Sie NULL ausdrücklich in den Abfragen.
Fügen Sie die numerischen Werte 0 und 1 ein, vorzugsweise über gebundene Parameter im Anwendungscode. Rufen Sie Zeilen mit dem Wert wahr über WHERE flag = 1 und Zeilen mit dem Wert falsch über WHERE flag = 0 ab; vermischen Sie diese Vergleiche nicht mit Zeichenfolgen wie 'true'. So ist die Konvention auf jeder Ebene sichtbar und verschiedene Teile einer Anwendung legen die Spalte nicht unterschiedlich aus. Das Beispiel erstellt eine Tabelle für Studierende, fügt fünf Zeilen ein und liest die gespeicherten Merkmalswerte aus. Außerdem erstellt es eine separate Tabelle mit Textwerten, sodass sich beide Konventionen direkt vergleichen lassen.
import sqlite3
connection = sqlite3.connect(":memory:")
connection.execute("""
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER NOT NULL,
international_student INTEGER NOT NULL
CHECK (international_student IN (0, 1))
)
""")
connection.executemany(
"INSERT INTO students (id, name, age, international_student) VALUES (?, ?, ?, ?)",
[
(1, "Stefan", 13, 1),
(2, "Damon", 14, 0),
(3, "Elena", 12, 1),
(4, "Caroline", 12, 1),
(5, "Bonnie", 13, 0),
],
)
integer_rows = connection.execute(
"SELECT name, international_student FROM students ORDER BY id"
).fetchall()
connection.execute("""
CREATE TABLE student_flags (
student_id INTEGER PRIMARY KEY,
international_student TEXT NOT NULL
CHECK (international_student IN ('true', 'false'))
)
""")
connection.executemany(
"INSERT INTO student_flags VALUES (?, ?)",
[(1, "true"), (2, "false"), (3, "true"), (4, "true"), (5, "false")],
)
text_rows = connection.execute(
"SELECT student_id, international_student FROM student_flags ORDER BY student_id"
).fetchall()
print("Integer convention:", integer_rows)
print("Text convention:", text_rows)
Integer convention: [('Stefan', 1), ('Damon', 0), ('Elena', 1), ('Caroline', 1), ('Bonnie', 0)]
Text convention: [(1, 'true'), (2, 'false'), (3, 'true'), (4, 'true'), (5, 'false')]
Die angezeigten Zeilen enthalten in der ersten Tabelle weiterhin Ganzzahlwerte und in der zweiten weiterhin Textwerte. Das Beispiel wählt alle Zeilen aus, damit die gespeicherte Darstellung sichtbar ist. Ergänzen Sie in einer Anwendungsabfrage für die Ganzzahltabelle eine Bedingung wie WHERE international_student = 1. Verwenden Sie Literale desselben Typs wie die Konvention der Spalte.
Boolesche Werte als Text darstellen
Text ist nützlich, wenn ein externes Format bereits Bezeichnungen wie true und false verwendet oder wenn sich gespeicherte Werte so leichter prüfen lassen. Deklarieren Sie die Spalte als TEXT, legen Sie eine einheitliche Schreibweise einschließlich Groß- und Kleinschreibung fest und prüfen Sie die Werte wie oben bei student_flags mit einer CHECK-Bedingung. Die Abfrage gibt die Textwerte direkt zurück; der Anwendungscode sollte beim Schreiben und Lesen dieselbe Konvention verwenden. Die Typaffinität von SQLite macht aus keiner der beiden Deklarationen einen Boolean-Typ und beschränkt die Spalte auch nicht von selbst auf zwei Werte.
Bei dieser Konvention müssen Einfügungen die gewählten Textwerte verwenden und Abfragen denselben Wert vergleichen, zum Beispiel mit WHERE international_student = 'true'. Eine CHECK-Liste sorgt für einheitliche Schreibweisen; NOT NULL verlangt, dass jede Zeile einen der festgelegten Werte enthält. Text kann zu einer Schnittstelle oder einem Dateiformat passen, das bereits Wörter austauscht. Dafür müssen sich alle schreibenden und lesenden Komponenten an dieselbe Konvention halten. Vermeiden Sie eine Mischung aus Werten wie 1, TRUE und true, denn dann brauchen Vergleiche und die Verarbeitung im Anwendungscode zusätzliche Regeln.
Für die meisten Tabellen, in denen das Merkmal innerhalb der Datenbank als Wert mit zwei Zuständen verwendet wird, empfiehlt sich INTEGER mit 0 und 1. Ergänzen Sie NOT NULL und CHECK, wenn jede Zeile einen eindeutigen, eingeschränkten Wert haben muss. Wählen Sie Text, wenn die Übereinstimmung mit einer etablierten Textschnittstelle praktisch ist. Prüfen Sie vor der Entscheidung, wie vorhandene Daten und Clients das Feld codieren. Dokumentieren Sie die Zuordnung, setzen Sie sie im Schema durch, binden Sie Werte in derselben Darstellung und verwenden Sie in allen Abfragen passende Vergleiche. Als Affinitätsbezeichnung kann SQLite auch der Typname BOOLEAN deklariert werden. Er schafft jedoch keine separate Boolean-Speicherklasse und ersetzt keine Einschränkungen, mit denen die Anwendungsregel durchgesetzt wird.