Error de PostgreSQL: value too long for type character varying
ERROR: value too long for type character varying(50)
Una cadena superó el límite de longitud declarado de su columna, y PostgreSQL rechazó la escritura en vez de truncarla silenciosamente. Molestamente, el mensaje nombra el tipo pero no la columna — encontrar qué columna es el paso uno.
Qué significa este error
Dos hechos específicos de PostgreSQL enmarcan la solución:
- No hay beneficio de rendimiento en
varchar(n)frente atexten PostgreSQL — se almacenan de forma idéntica. El límite es puramente una restricción, así que debería existir solo donde el negocio realmente tiene una. - Ensanchar un varchar no reescribe la tabla — aumentar el límite es un cambio rápido, solo de catálogo.
Causas comunes
- Datos reales que superaron un límite arbitrario — el
varchar(255)de culto al cargo encontrándose con una URL larga, un user agent o una dirección. - Concatenación o campos desnormalizados creciendo más allá de la estimación original.
- Importaciones con un mapeo de columnas incorrecto metiendo valores largos en campos cortos.
Cómo diagnosticarlo
-- Qué columnas varchar(50) tiene la tabla sospechosa:
SELECT column_name, character_maximum_length
FROM information_schema.columns
WHERE table_name = 'users' AND character_maximum_length IS NOT NULL;
Luego compara con el payload que falló. Si la sentencia está registrada, los valores están ahí mismo.
Cómo solucionarlo
- Ensánchalo (rápido, solo de catálogo):
ALTER TABLE users ALTER COLUMN name TYPE varchar(200); - O elimina el límite arbitrario por completo —
text, con una restricción CHECK si algún límite genuinamente importa:
Un CHECK es más fácil de ajustar después que un tipo.ALTER TABLE users ALTER COLUMN name TYPE text; ALTER TABLE users ADD CONSTRAINT name_reasonable CHECK (length(name) <= 1000); - Trunca en el cliente solo si el truncado es genuinamente aceptable (
left(value, 50)) — esa es una decisión de producto, no un valor por defecto de la base de datos, que es exactamente por qué PostgreSQL se niega a tomarla por ti.
