🏷️Typen: dynamisch, mit Affinität – oder STRICT
In SQLite hat der Wert einen Typ, nicht die Spalte. Der deklarierte Spaltentyp ist nur eine Empfehlung („Affinität“), in welche Speicherklasse Werte beim Speichern möglichst umgewandelt werden. Quelle: sqlite.org/datatype3.html und /stricttables.html.
📦Fünf Speicherklassen
NULL
kein Wert
Serial Type 0
INTEGER
vorzeichenbehaftet, 0–8 Bytes je nach Größe
Serial Types 1–6, 8, 9
REAL
8-Byte-IEEE-754-Gleitkommazahl
Serial Type 7
TEXT
Zeichenkette in UTF-8, UTF-16le oder UTF-16be
ungerade Serial Types ≥ 13
BLOB
Bytes, genau wie eingegeben
gerade Serial Types ≥ 12
🧲Die fünf Affinitätsregeln
Der deklarierte Typ wird als Text untersucht – die erste passende Regel gewinnt. Deshalb landet „FLOATING POINT“ bei INTEGER (wegen „INT“ in „POINT“) und „STRING“ bei NUMERIC.
| Regel | Bedingung | Affinität |
|---|---|---|
| 1 | Typ enthält „INT“ | INTEGER |
| 2 | enthält „CHAR“, „CLOB“ oder „TEXT“ | TEXT |
| 3 | enthält „BLOB“ oder kein Typ angegeben | BLOB |
| 4 | enthält „REAL“, „FLOA“ oder „DOUB“ | REAL |
| 5 | sonst | NUMERIC |
💡 Was die Affinität tut
TEXT-Affinität macht aus Zahlen Text. NUMERIC/INTEGER wandeln Text, der wie eine Zahl aussieht, in INTEGER oder REAL um (REAL mit ganzem Wert wird zu INTEGER). REAL macht aus Ganzzahlen Gleitkommazahlen. BLOB lässt alles, wie es ist. Nicht umwandelbarer Text bleibt einfach Text – ohne Fehler.
⚠️ Folge
In eine INTEGER-Spalte kann man „abc“ schreiben. Wer das verhindern will, nimmt CHECK-Constraints oder STRICT-Tabellen.
🔬Live-Matrix: Typ × Wert
Welche Speicherklasse kommt heraus, wenn man diesen Wert in eine Spalte dieses Typs schreibt?
SQLite (WebAssembly) wird geladen …
🛡️STRICT-Tabellen (seit 3.37.0, 2021)
Mit STRICT hinter der Spaltenliste erlaubt SQLite nur noch INT, INTEGER, REAL, TEXT, BLOB und ANY als Typ und prüft jeden Wert: Was sich nicht verlustfrei umwandeln lässt, wird abgelehnt. ANY nimmt alles unverändert.
SQLite (WebAssembly) wird geladen …
Im Dateiformat ändert STRICT nichts – die Records sehen gleich aus. Die Beispiel-DB enthält die STRICT-Tabelle messwerte; ältere SQLite-Versionen als 3.37 können deren Schema nicht lesen.