Zusammenfassung :In diesem Tutorial lernen Sie das SQLite-Datentypsystem und die damit verbundenen Konzepte wie Speicherklassen, Manifesttypisierung und Typaffinität kennen.
Einführung in SQLite-Datentypen
Wenn Sie von anderen Datenbanksystemen wie MySQL und PostgreSQL kommen, werden Sie feststellen, dass sie statische Typisierung verwenden . Das bedeutet, wenn Sie eine Spalte mit einem bestimmten Datentyp deklarieren, kann diese Spalte nur Daten des deklarierten Datentyps speichern.
Anders als andere Datenbanksysteme verwendet SQLite ein dynamisches Typsystem . Mit anderen Worten, ein in einer Spalte gespeicherter Wert bestimmt ihren Datentyp, nicht den Datentyp der Spalte.
Außerdem müssen Sie beim Erstellen einer Tabelle keinen bestimmten Datentyp für eine Spalte deklarieren. Falls Sie eine Spalte mit dem Integer-Datentyp deklarieren, können Sie beliebige Datentypen wie Text und BLOB speichern, SQLite wird sich darüber nicht beschweren.
SQLite bietet fünf primitive Datentypen, die als Speicherklassen bezeichnet werden.
Speicherklassen beschreiben die Formate, die SQLite zum Speichern von Daten auf der Festplatte verwendet. Eine Speicherklasse ist allgemeiner als ein Datentyp, z. B. INTEGER
Die Speicherklasse umfasst 6 verschiedene Arten von Ganzzahlen. In den meisten Fällen können Sie Speicherklassen und Datentypen austauschbar verwenden.
Die folgende Tabelle zeigt 5 Speicherklassen in SQLite:
Speicherklasse | Bedeutung |
---|---|
NULL | NULL-Werte bedeuten fehlende Informationen oder unbekannt. |
INTEGER | Integerwerte sind ganze Zahlen (entweder positiv oder negativ). Eine Ganzzahl kann variable Größen wie 1, 2, 3, 4 oder 8 Byte haben. |
ECHT | Reale Werte sind reelle Zahlen mit Dezimalwerten, die 8-Byte-Fließkommazahlen verwenden. |
TEXT | TEXT wird verwendet, um Zeichendaten zu speichern. Die maximale Länge von TEXT ist unbegrenzt. SQLite unterstützt verschiedene Zeichenkodierungen. |
BLOB | BLOB steht für ein binäres großes Objekt, das beliebige Daten speichern kann. Die maximale Größe von BLOB ist theoretisch unbegrenzt. |
SQLite bestimmt den Datentyp eines Werts basierend auf seinem Datentyp gemäß den folgenden Regeln:
- Wenn ein Literal keine einschließenden Anführungszeichen und keinen Dezimalpunkt oder Exponenten hat, weist SQLite die Speicherklasse INTEGER zu.
- Wenn ein Literal in einfache oder doppelte Anführungszeichen eingeschlossen ist, weist SQLite die TEXT-Speicherklasse zu.
- Wenn ein Literal kein Anführungszeichen, keinen Dezimalpunkt oder Exponenten hat, weist SQLite die Speicherklasse REAL zu.
- Wenn ein Literal NULL ohne Anführungszeichen ist, hat es die Speicherklasse NULL zugewiesen.
- Wenn ein Literal X’ABCD’ oder x ‘abcd’ hat, weist SQLite die BLOB-Speicherklasse zu.
SQLite unterstützt keine integrierten Datums- und Zeitspeicherklassen. Sie können jedoch TEXT, INT oder REAL verwenden, um Datums- und Zeitwerte zu speichern. Ausführliche Informationen zum Umgang mit Datums- und Uhrzeitwerten finden Sie im SQLite-Tutorial für Datum und Uhrzeit.
SQLites stellt den typeof()
bereit Funktion, mit der Sie die Speicherklasse eines Werts anhand seines Formats überprüfen können. Siehe folgendes Beispiel:
SELECT
typeof(100),
typeof(10.0),
typeof('100'),
typeof(x'1000'),
typeof(NULL);
Code language: SQL (Structured Query Language) (sql)
Eine einzelne Spalte in SQLite kann gemischte Datentypen speichern. Siehe folgendes Beispiel.
Erstellen Sie zunächst eine neue Tabelle mit dem Namen test_datatypes
zum Testen.
CREATE TABLE test_datatypes (
id INTEGER PRIMARY KEY,
val
);
Code language: SQL (Structured Query Language) (sql)
Zweitens, fügen Sie Daten in die test_datatypes
ein Tabelle.
INSERT INTO test_datatypes (val)
VALUES
(1),
(2),
(10.1),
(20.5),
('A'),
('B'),
(NULL),
(x'0010'),
(x'0011');
Code language: SQL (Structured Query Language) (sql)
Drittens verwenden Sie typeof()
Funktion, um den Datentyp jedes in val
gespeicherten Werts abzurufen Spalte.
SELECT
id,
val,
typeof(val)
FROM
test_datatypes;
Code language: SQL (Structured Query Language) (sql)
Sie fragen sich vielleicht, wie SQLite Daten in einer Spalte mit unterschiedlichen Speicherklassen sortiert, wie z. B. val-Spalte oben.
Um dies zu beheben, bietet SQLite die folgenden Regeln zum Sortieren:
- NULL-Speicherklasse hat den niedrigsten Wert. Er ist niedriger als alle anderen Werte. Zwischen NULL-Werten gibt es keine Reihenfolge.
- Die nächst höheren Speicherklassen sind INTEGER und REAL. SQLite vergleicht INTEGER und REAL numerisch.
- Die nächsthöhere Speicherklasse ist TEXT. SQLite verwendet die Sortierung von TEXT-Werten, wenn es die TEXT-Werte vergleicht.
- Die höchste Speicherklasse ist das BLOB. SQLite verwendet die C-Funktion
memcmp()
um BLOB-Werte zu vergleichen.
Wenn Sie den ORDER BY
verwenden -Klausel zum Sortieren der Daten in einer Spalte mit unterschiedlichen Speicherklassen führt SQLite die folgenden Schritte aus:
- Gruppieren Sie zuerst Werte basierend auf der Speicherklasse:NULL, INTEGER und REAL, TEXT und BLOB.
- Als nächstes sortieren Sie die Werte in jeder Gruppe.
Die folgende Anweisung sortiert die gemischten Daten im val
Spalte der test_datatypes
Tabelle:
SELECT
id,
val,
typeof(val)
FROM
test_datatypes
ORDER BY val;
Code language: SQL (Structured Query Language) (sql)
SQLite-Manifesttypisierung und Typaffinität
Andere wichtige Konzepte im Zusammenhang mit SQLite-Datentypen sind Manifesttypisierung und Typaffinität:
- Manifesttypisierung bedeutet, dass ein Datentyp eine Eigenschaft eines in einer Spalte gespeicherten Werts ist, nicht die Eigenschaft der Spalte, in der der Wert gespeichert ist. SQLite verwendet Manifesttypisierung, um Werte beliebigen Typs in einer Spalte zu speichern.
- Typaffinität einer Spalte ist der empfohlene Typ für Daten, die in dieser Spalte gespeichert sind. Beachten Sie, dass der Datentyp empfohlen und nicht erforderlich ist, daher kann eine Spalte jeden Datentyp speichern.
In diesem Lernprogramm haben Sie etwas über SQLite-Datentypen und einige wichtige Konzepte gelernt, darunter Speicherklassen, Manifesttypisierung und Typaffinität.