🏷️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.
RegelBedingungAffinität
1Typ enthält „INT“INTEGER
2enthält „CHAR“, „CLOB“ oder „TEXT“TEXT
3enthält „BLOB“ oder kein Typ angegebenBLOB
4enthält „REAL“, „FLOA“ oder „DOUB“REAL
5sonstNUMERIC
💡 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.