Heute quatschen wir über numerische Datentypen in PostgreSQL. Wenn du dich schon mal gefragt hast, wie man die Zahl "42", Finanzberechnungen oder vielleicht Millisekunden speichert – bist du hier genau richtig. Lass uns klären, welcher Typ für welche Aufgabe passt, damit du und deine Daten sich wohlfühlen.
Numerische Datentypen in PostgreSQL sind in drei Hauptgruppen unterteilt:
- Ganze Zahlen (
INTEGER): Zum Speichern von Zahlen ohne Nachkommastellen. Das sind so Zahlen wie 1, 42, -7. - Exakte Zahlen (
NUMERIC): Für Zahlen mit fester Anzahl an Nachkommastellen. Super für Finanzberechnungen, wo Genauigkeit wichtiger als alles andere ist. - Gleitkommazahlen (
REAL): Für Zahlen, die richtig groß oder winzig klein sein können. Sie sind weniger genau alsNUMERIC, aber perfekt für wissenschaftliche Berechnungen.
Typ INTEGER
INTEGER ist der Datentyp für ganze Zahlen. Perfekt, wenn du Zahlen ohne Nachkommastellen speichern willst. PostgreSQL bietet gleich drei Varianten von INTEGER, damit du verschiedene Wertebereiche abdecken kannst:
SMALLINT: Kleiner Ganzzahl-Typ. Wertebereich: von -32.768 bis 32.767.INTEGER(oderINT): Standard-Ganzzahl-Typ. Wertebereich: von -2.147.483.648 bis 2.147.483.647.BIGINT: Für richtig große Zahlen. Wertebereich: von -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807.
Stell dir vor, wir haben eine Tabelle students, in der Infos über Studierende gespeichert sind: ihr Name, Alter und die Anzahl der gesammelten Credits (Leistungspunkte):
| id | name | age | credits |
|---|---|---|---|
| 1 | Otto Nate | 21 | 30 |
| 2 | Maria Chi | 22 | 45 |
| 3 | Peter Val | 20 | 60 |
| 4 | Anna Song | 23 | 50 |
| 5 | Sophie Zhang | 21 | 35 |
Jetzt machen wir einen einfachen SQL-Query, um die Liste der Studierenden mit ihrem Alter und ihren Credits zu bekommen:
SELECT name, age, credits
FROM students;
Ergebnis:
| name | age | credits |
|---|---|---|
| Otto Nate | 21 | 30 |
| Maria Chi | 22 | 45 |
| Peter Val | 20 | 60 |
| Anna Song | 23 | 50 |
| Sophie Zhang | 21 | 35 |
Wann solltest du INTEGER verwenden?
- Speichern von IDs (
id, Bestellnummern). - Speichern von Mengen (z.B. Anzahl der Produkte im Lager, Anzahl der Studierenden).
Typ NUMERIC
NUMERIC ist der Datentyp für exakte Zahlen mit fester Nachkommastelle. Wenn du sowas wie 123.456 speichern willst und ein Fehler an der Nachkommastelle deinen Ruf (oder Geld) kostet, nimm NUMERIC.
So deklarierst du das: NUMERIC(precision, scale), wobei:
precision– die Gesamtanzahl der Ziffern (vor und nach dem Komma).scale– die Anzahl der Ziffern nach dem Komma.
Zum Beispiel erlaubt NUMERIC(6, 2) Zahlen mit maximal 6 Ziffern, davon 2 nach dem Komma.
Lass uns eine Tabelle für Finanztransaktionen anlegen:
| id | description | amount |
|---|---|---|
| 1 | Zahlung für Studium | 2345.67 |
| 2 | Monatliches Stipendium | 500.00 |
| 3 | Laborgebühr | 145.99 |
| 4 | Bibliotheksstrafe | 12.75 |
| 5 | Konferenzanmeldung | 320.50 |
Jetzt zeigen wir die Transaktionen an:
SELECT description, amount
FROM transactions;
Ergebnis:
| description | amount |
|---|---|
| Zahlung für Studium | 2345.67 |
| Monatliches Stipendium | 500.00 |
| Laborgebühr | 145.99 |
| Bibliotheksstrafe | 12.75 |
| Konferenzanmeldung | 320.50 |
Wann solltest du NUMERIC verwenden?
- Finanzberechnungen (Produktpreise, Gehälter).
- Speichern von exakten Messwerten (Gewicht, Länge).
Tabelle measurements
| id | mass - REAL | height - REAL |
|---|---|---|
| 1 | 70.5 | 1.83 |
| 2 | 64.2 | 1.75 |
| 3 | 82.3 | 1.92 |
| 4 | 55.0 | 1.60 |
Jetzt zeigen wir die Werte an:
SELECT mass, height
FROM measurements;
Ergebnis:
| mass | height |
|---|---|
| 70.5 | 1.83 |
| 64.2 | 1.75 |
| 82.3 | 1.92 |
| 55.0 | 1.60 |
Wann solltest du REAL verwenden?
- Wissenschaftliche Berechnungen (Atommasse, Entfernung zum Mond).
- Datenmodellierung, wo kleine Ungenauigkeiten okay sind.
Vergleich der numerischen Typen: Wann was nehmen?
| Datentyp | Wertebereich | Genauigkeit | Beispielanwendungen |
|---|---|---|---|
SMALLINT |
-32.768 bis 32.767 | Ganze Zahlen | Kleine Zahlen (Alter, Bewertungen). |
INTEGER |
-2.147.483.648 bis 2.147.483.647 | Ganze Zahlen | IDs, Mengen. |
BIGINT |
-9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807 | Ganze Zahlen | Sehr große Zahlen. |
NUMERIC |
Hängt von precision und scale ab |
Exakte Dezimalzahlen | Finanzen, Messungen. |
REAL |
Ungefähr 6 Dezimalstellen | Gleitkommazahl | Ungefähre oder wissenschaftliche Daten. |
DOUBLE PRECISION |
Ungefähr 15 Dezimalstellen | Hochpräzise Gleitkommazahl | Wissenschaft, Forschung. |
Aliase
In PostgreSQL haben viele numerische Typen Aliase – das sind alternative Namen für Typen, die sich gleich verhalten, aber die Lesbarkeit oder Kompatibilität mit anderen DBMS verbessern.
Hier ein kurzes und verständliches Cheat-Sheet zu Aliase der numerischen Typen in PostgreSQL:
Aliase für Ganzzahl-Typen
| Alias | Echter Typ | Größe | Wertebereich |
|---|---|---|---|
INT |
INTEGER |
4 Byte | −2.147.483.648 bis 2.147.483.647 |
INT4 |
INTEGER |
4 Byte | (veralteter Alias) |
SMALLINT |
SMALLINT |
2 Byte | −32.768 bis 32.767 |
INT2 |
SMALLINT |
2 Byte | |
BIGINT |
BIGINT |
8 Byte | −9 Quintillionen bis +9 Quintillionen |
INT8 |
BIGINT |
8 Byte |
Aliase für exakte Zahlen
| Alias | Echter Typ | Zweck |
|---|---|---|
DEC |
NUMERIC |
SQL-Standard-Synonym |
DECIMAL |
NUMERIC |
Dasselbe |
Aliase für Gleitkommazahlen
| Alias | Echter Typ | Genauigkeit |
|---|---|---|
FLOAT |
DOUBLE PRECISION |
~15 Stellen (Standard) |
FLOAT(24) |
REAL |
~6 Stellen |
FLOAT(53) |
DOUBLE PRECISION |
~15 Stellen |
FLOAT8 |
DOUBLE PRECISION |
Veralteter Alias |
FLOAT4 |
REAL |
Veralteter Alias |
Typische Fehler
Beim Arbeiten mit numerischen Typen kann man auf ein paar Stolperfallen treffen:
Zu kleiner Datentyp gewählt. Wenn du für das Alter von Menschen SMALLINT nimmst, liegst du falsch. Dem Roboter aus der "Matrix", der Millionen Jahre alt ist, gefällt das nicht.
Datenverlust durch Rundung. Wenn du REAL für Finanzberechnungen verwendest, verlierst du Centbeträge. Und dann auch das Vertrauen der Kunden.
Vergleich verschiedener Typen. Wenn du INTEGER und REAL vergleichst, bekommst du manchmal unerwartete Ergebnisse wegen der Eigenheiten von Gleitkommazahlen.
GO TO FULL VERSION