Erreur PostgreSQL : value too long for type character varying
ERROR: value too long for type character varying(50)
Une chaîne a dépassé la limite de longueur déclarée de sa colonne, et PostgreSQL a rejeté l'écriture plutôt que de la tronquer silencieusement. Agaçant : le message nomme le type mais pas la colonne — trouver quelle colonne est la première étape.
Ce que signifie cette erreur
Deux faits propres à PostgreSQL cadrent la solution :
- Il n'y a aucun avantage de performance à
varchar(n)par rapport àtextdans PostgreSQL — ils sont stockés de façon identique. La limite est purement une contrainte, elle ne devrait donc exister que là où le métier en a réellement une. - Élargir un varchar ne réécrit pas la table — augmenter la limite est un changement rapide, uniquement dans le catalogue.
Causes fréquentes
- Les données réelles ont dépassé une limite arbitraire — le
varchar(255)culte du cargo rencontrant une longue URL, un user agent ou une adresse. - Concaténation ou champs dénormalisés dépassant l'estimation d'origine.
- Imports avec un mauvais mappage de colonnes mettant de longues valeurs dans de courts champs.
Comment la diagnostiquer
-- Quelles colonnes varchar(50) a la table suspecte :
SELECT column_name, character_maximum_length
FROM information_schema.columns
WHERE table_name = 'users' AND character_maximum_length IS NOT NULL;
Puis comparez à la charge utile qui a échoué. Si l'instruction est journalisée, les valeurs sont juste là.
Comment la corriger
- Élargissez-le (rapide, catalogue uniquement) :
ALTER TABLE users ALTER COLUMN name TYPE varchar(200); - Ou supprimez entièrement la limite arbitraire —
text, avec une contrainte CHECK si une borne compte réellement :
Un CHECK est plus facile à ajuster ultérieurement qu'un type.ALTER TABLE users ALTER COLUMN name TYPE text; ALTER TABLE users ADD CONSTRAINT name_reasonable CHECK (length(name) <= 1000); - Tronquez côté client uniquement si la troncature est réellement acceptable (
left(value, 50)) — c'est une décision produit, pas un comportement par défaut de la base, ce qui est précisément pourquoi PostgreSQL refuse de la prendre pour vous.
