PostgreSQL-Fehler: invalid input syntax for type
ERROR: invalid input syntax for type integer: "abc"
Ein Textwert musste in einen typisierten umgewandelt werden — integer, uuid, date, numeric — und konnte nicht geparst werden. Die Meldung zitiert den anstößigen Wert, was meist die Quelle sofort identifiziert: eine Kopfzeile, ein leerer String oder Daten, die nie validiert wurden.
Was dieser Fehler bedeutet
Dies feuert überall dort, wo Text auf einen Typ trifft: explizite Casts ('abc'::int), als Text gebundene Parameter, COPY, das eine Datei liest, oder implizite Konvertierungen in Vergleichen. Beachten Sie, was es nicht ist: ein NULL-Problem (NULL castet problemlos zu allem) — es ist ein Wert, der existiert und für den Zieltyp fehlerhaft ist. Der leere String ist der Klassiker: ''::int schlägt fehl, weil leer nicht null ist.
Häufige Ursachen
- Benutzereingaben oder gescrapte Daten casten ohne Validierung.
- Leere Strings für numerische Felder aus Formularen oder APIs, die
""statt null senden. - CSV-Importe: die Kopfzeile als Daten gelesen, ein falscher Trennzeichen, das Spalten zusammenklebt, oder Locale-Formate (Komma-Dezimalstellen, T/M/J-Daten), die der Server nicht erwartet.
- IDs der falschen Form — eine numerische ID, wo eine uuid-Spalte
xxxxxxxx-xxxx-...erwartet.
So diagnostizieren Sie ihn
- Der gequotete Wert in der Meldung ist die Diagnose:
"abc"sagt schmutzige Daten,""sagt Leer-String-Behandlung,"id"sagt Kopfzeile. - Für Importe finden Sie die schlechten Zeilen, indem Sie zuerst als Text laden (nächster Abschnitt) und den Cast als Query ausführen — Sie erhalten alle Übeltäter, nicht nur den ersten.
So beheben Sie ihn
- Leere Strings → an der Grenze in NULL umwandeln:
NULLIF(value, '')::int. - Importe → in eine Staging-Tabelle mit Textspalten laden, dann in einem kontrollierten INSERT ... SELECT casten, wo Sie bereinigen, filtern und protokollieren können:
COPY staging FROM '/tmp/data.csv' WITH (FORMAT csv, HEADER); INSERT INTO target (id, amount) SELECT id::uuid, NULLIF(amount, '')::numeric FROM staging; - Validieren Sie an der Anwendungsgrenze, sodass schlechte Werte mit einer nützlichen Meldung abgewiesen werden, bevor sie einen Cast erreichen.
