El síntoma: el texto no cabe en la columna
La causa común es sencilla: la fila intenta guardar un valor mayor que el límite definido para el tipo de texto. El mensaje cambia según el motor. PostgreSQL puede indicar value too long for type character varying(n); MySQL puede informar Data too long for column; y SQL Server puede usar String or binary data would be truncated.
Ejemplo: seis caracteres en una columna de cinco
CREATE TABLE codigos_demo (
codigo VARCHAR(5)
);
INSERT INTO codigos_demo (codigo)
VALUES ('ABC123');ABC123 tiene seis caracteres. En motores que aplican ese límite, la fila no cabe. No concluyas que «la sentencia está mal escrita»: la sintaxis puede ser válida y el conflicto estar entre el dato y el esquema.
La misma definición no significa lo mismo en todos los motores
| Motor | Comportamiento relevante |
|---|---|
| PostgreSQL | varchar(n) limita a n caracteres; un valor más largo produce error salvo excepciones específicas documentadas para espacios finales o casts explícitos. |
| MySQL 8.4 | VARCHAR(n) declara un máximo de caracteres. Con modo estricto, un valor que lo excede se rechaza; sin modo estricto puede truncarse y generar una advertencia. |
| SQL Server | En varchar(n), n expresa bytes, no necesariamente caracteres. SQL Server 2019+ puede mostrar el error 2628 con tabla, columna y valor truncado cuando las advertencias detalladas están habilitadas. |
| SQLite | El número de VARCHAR(n) se ignora: VARCHAR(5) tiene afinidad TEXT y no impone por sí solo un límite de cinco caracteres. |
No pruebes la corrección solo en SQLite si producción usa otro motor. Una fila que SQLite acepta puede ser rechazada por una columna VARCHAR(n) en PostgreSQL, MySQL o SQL Server.
Diagnostica el dato antes de cambiar el esquema
Empieza comparando la longitud real del valor con el límite esperado. Este ejemplo es deliberadamente local y se comprobó en SQLite; modela un límite expresado en caracteres:
WITH entrada(campo, valor, max_caracteres) AS (
VALUES ('codigo', 'ABC123', 5),
('nombre', 'Taza', 40)
)
SELECT
campo,
valor,
length(valor) AS caracteres,
max_caracteres,
CASE
WHEN length(valor) > max_caracteres THEN 'excede'
ELSE 'ok'
END AS estado
FROM entrada
ORDER BY campo;| campo | valor | caracteres | max_caracteres | estado |
|---|---|---|---|---|
| codigo | ABC123 | 6 | 5 | excede |
| nombre | Taza | 4 | 40 | ok |
La función de longitud cambia por motor: PostgreSQL y MySQL ofrecen CHAR_LENGTH, SQLite usa length y SQL Server dispone de LEN. En SQL Server, si el límite que investigas es varchar(n), revisa además los bytes con DATALENGTH, sobre todo con codificaciones multibyte.
Corrige la causa, no solo el mensaje
- Si el dato es incorrecto, corrige su origen antes del
INSERToUPDATE. - Si el dato es válido y el límite quedó corto, amplía la columna mediante la sintaxis compatible con tu motor y revisa índices, dependencias y coste del cambio.
- Si el límite representa una regla real, conserva la restricción y valida el valor antes de persistirlo.
- Si decides truncar, hazlo solo como regla explícita del negocio; recortar silenciosamente puede perder identificadores, nombres o descripciones importantes.
No conviertas automáticamente cada columna en un tipo «sin límite». Un máximo puede expresar una regla útil, y cambiar tipos en una tabla grande puede tener implicaciones de bloqueo, almacenamiento o índices.
Método de diagnóstico
- Identifica la tabla y la columna que recibe el valor.
- Comprueba el tipo y el límite declarados en el esquema real de ese entorno.
- Mide el valor problemático con la función adecuada al motor.
- Revisa si el límite se expresa en caracteres o bytes.
- Decide si está mal el dato, el límite o ambos antes de repetir la escritura.
Error frecuente: recortar el texto hasta que «pase»
LEFT(valor, n) puede ocultar el síntoma y crear otro problema. Si el campo es un código, un correo o un identificador, perder el final puede convertir un valor válido en otro dato distinto o provocar colisiones.
Práctica correctiva
Encuentra el código que supera ocho caracteres
Sin modificar los datos, devuelve solo las filas cuyo codigo tenga más de 8 caracteres.
length(codigo).> 8 y no uses SUBSTR para ocultar el valor.Solución razonada
WITH candidatos(id, codigo) AS (
VALUES (1, 'VIP2026'),
(2, 'PROMO2026X'),
(3, 'NUEVO')
)
SELECT id, codigo, length(codigo) AS caracteres
FROM candidatos
WHERE length(codigo) > 8
ORDER BY id;El resultado contiene solo PROMO2026X, con 10 caracteres. La consulta diagnostica la fila problemática sin cambiarla, para que después puedas decidir si corriges el dato o el esquema.
Qué debes recordar
- Un valor demasiado largo es un conflicto entre dato y definición de columna, no necesariamente un error de sintaxis.
- PostgreSQL, MySQL y SQL Server aplican límites de texto con matices distintos; SQLite ignora el número de
VARCHAR(n). - Mide antes de modificar y distingue caracteres de bytes cuando el motor lo requiera.
- No truncar a ciegas: decide si debe cambiar el dato, la columna o la regla de validación.