Errore PostgreSQL: invalid input syntax for type
ERROR: invalid input syntax for type integer: "abc"
Un valore testuale doveva essere convertito in uno tipizzato — integer, uuid, date, numeric — e non è stato interpretabile. Il messaggio riporta tra virgolette il valore incriminato, che di solito identifica la fonte immediatamente: una riga di header, una stringa vuota, o dati mai validati.
Cosa significa questo errore
Scatta ovunque il testo incontri un tipo: cast espliciti ('abc'::int), parametri bindati come testo, COPY che legge un file, o conversioni implicite nei confronti. Nota cosa non è: un problema di NULL (il NULL fa il cast a qualsiasi cosa senza problemi) — è un valore che esiste ed è malformato per il tipo di destinazione. La stringa vuota è il classico: ''::int fallisce, perché vuoto non è zero.
Cause comuni
- Cast di input dell'utente o dati raccolti senza validazione.
- Stringhe vuote per campi numerici da form o API che inviano
""invece di null. - Import CSV: la riga di header letta come dato, un delimitatore sbagliato che incolla insieme le colonne, o formati locali (decimali con la virgola, date G/M/A) che il server non si aspetta.
- ID della forma sbagliata — un ID numerico dove una colonna uuid si aspetta
xxxxxxxx-xxxx-....
Come diagnosticarlo
- Il valore tra virgolette nel messaggio è la diagnosi:
"abc"dice dati sporchi,""dice gestione della stringa vuota,"id"dice riga di header. - Per gli import, trova le righe errate caricando prima come testo (sezione successiva) ed eseguendo il cast come query — ottieni tutti i colpevoli, non solo il primo.
Come risolverlo
- Stringhe vuote → converti in NULL al confine:
NULLIF(value, '')::int. - Import → carica in una tabella di staging con colonne di testo, poi fai il cast in un INSERT ... SELECT controllato, dove puoi pulire, filtrare e loggare:
COPY staging FROM '/tmp/data.csv' WITH (FORMAT csv, HEADER); INSERT INTO target (id, amount) SELECT id::uuid, NULLIF(amount, '')::numeric FROM staging; - Valida al confine dell'applicazione così i valori errati vengono rifiutati con un messaggio utile prima che raggiungano un cast.
