Erreur PostgreSQL : invalid input syntax for type
ERROR: invalid input syntax for type integer: "abc"
Une valeur textuelle devait être convertie en une valeur typée — integer, uuid, date, numeric — et n'a pas pu être analysée. Le message cite la valeur fautive, ce qui identifie généralement la source immédiatement : une ligne d'en-tête, une chaîne vide, ou des données jamais validées.
Ce que signifie cette erreur
Cela se déclenche partout où le texte rencontre un type : casts explicites ('abc'::int), paramètres liés en texte, COPY lisant un fichier, ou conversions implicites dans les comparaisons. Notez ce que ce n'est pas : un problème de NULL (NULL se caste sans souci vers n'importe quoi) — c'est une valeur qui existe et est malformée pour le type cible. La chaîne vide est le cas classique : ''::int échoue, car vide n'est pas zéro.
Causes fréquentes
- Caster des saisies utilisateur ou des données scrapées sans validation.
- Chaînes vides pour des champs numériques provenant de formulaires ou d'API qui envoient
""au lieu de null. - Imports CSV : la ligne d'en-tête lue comme donnée, un mauvais délimiteur collant les colonnes, ou des formats locaux (décimales à virgule, dates J/M/A) que le serveur n'attend pas.
- ID de mauvaise forme — un ID numérique là où une colonne uuid attend
xxxxxxxx-xxxx-....
Comment la diagnostiquer
- La valeur citée dans le message est le diagnostic :
"abc"dit données sales,""dit gestion de chaîne vide,"id"dit ligne d'en-tête. - Pour les imports, trouvez les lignes incorrectes en chargeant d'abord en texte (section suivante) et en exécutant le cast comme une requête — vous obtenez tous les fautifs, pas seulement le premier.
Comment la corriger
- Chaînes vides → convertissez en NULL à la frontière :
NULLIF(value, '')::int. - Imports → chargez dans une table de staging avec des colonnes texte, puis castez dans un INSERT ... SELECT contrôlé, où vous pouvez nettoyer, filtrer et journaliser :
COPY staging FROM '/tmp/data.csv' WITH (FORMAT csv, HEADER); INSERT INTO target (id, amount) SELECT id::uuid, NULLIF(amount, '')::numeric FROM staging; - Validez à la frontière applicative afin que les valeurs incorrectes soient rejetées avec un message utile avant d'atteindre un cast.
