Error de PostgreSQL: invalid input syntax for type
ERROR: invalid input syntax for type integer: "abc"
Un valor textual tuvo que convertirse a uno tipado — integer, uuid, date, numeric — y no pudo parsearse. El mensaje entrecomilla el valor infractor, lo que suele identificar la fuente de inmediato: una fila de cabecera, una cadena vacía, o datos que nunca se validaron.
Qué significa este error
Esto se dispara allá donde el texto se encuentra con un tipo: casts explícitos ('abc'::int), parámetros ligados como texto, COPY leyendo un archivo, o conversiones implícitas en comparaciones. Fíjate en lo que no es: un problema de NULL (NULL se castea bien a cualquier cosa) — es un valor que existe y está malformado para el tipo de destino. La cadena vacía es el clásico: ''::int falla, porque vacío no es cero.
Causas comunes
- Castear entrada del usuario o datos scrapeados sin validación.
- Cadenas vacías para campos numéricos desde formularios o APIs que envían
""en vez de null. - Importaciones CSV: la fila de cabecera leída como datos, un delimitador incorrecto pegando columnas entre sí, o formatos de locale (decimales con coma, fechas D/M/A) que el servidor no espera.
- IDs con la forma equivocada — un ID numérico donde una columna uuid espera
xxxxxxxx-xxxx-....
Cómo diagnosticarlo
- El valor entrecomillado del mensaje es el diagnóstico:
"abc"dice datos sucios,""dice manejo de cadena vacía,"id"dice fila de cabecera. - Para importaciones, encuentra las filas incorrectas cargando primero como texto (siguiente sección) y ejecutando el cast como una consulta — obtienes todos los infractores, no solo el primero.
Cómo solucionarlo
- Cadenas vacías → conviértelas a NULL en el límite:
NULLIF(value, '')::int. - Importaciones → carga en una tabla de staging con columnas de texto, luego castea en un INSERT ... SELECT controlado, donde puedes limpiar, filtrar y registrar:
COPY staging FROM '/tmp/data.csv' WITH (FORMAT csv, HEADER); INSERT INTO target (id, amount) SELECT id::uuid, NULLIF(amount, '')::numeric FROM staging; - Valida en el límite de la aplicación para que los valores incorrectos se rechacen con un mensaje útil antes de llegar a un cast.
