Error SQL · tipos de texto

Valor demasiado largo para VARCHAR: encuentra qué columna excede el límite

Un INSERT o UPDATE puede fallar cuando el texto no cabe en la longitud declarada de una columna. Antes de recortar el valor o ampliar el esquema, identifica qué dato excede el límite y decide cuál de los dos representa realmente el dominio.

Lectura: 12–16 minDiferencias por motorPráctica correctiva

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

Ejemplo conceptual
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

MotorComportamiento relevante
PostgreSQLvarchar(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.4VARCHAR(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 ServerEn 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.
SQLiteEl 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:

Comparar longitud y límite
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;
Resultado comprobado en SQLite
campovalorcaracteresmax_caracteresestado
codigoABC12365excede
nombreTaza440ok

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

  1. Si el dato es incorrecto, corrige su origen antes del INSERT o UPDATE.
  2. 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.
  3. Si el límite representa una regla real, conserva la restricción y valida el valor antes de persistirlo.
  4. 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

  1. Identifica la tabla y la columna que recibe el valor.
  2. Comprueba el tipo y el límite declarados en el esquema real de ese entorno.
  3. Mide el valor problemático con la función adecuada al motor.
  4. Revisa si el límite se expresa en caracteres o bytes.
  5. 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

Básica · diagnóstico de datos

Encuentra el código que supera ocho caracteres

Sin modificar los datos, devuelve solo las filas cuyo codigo tenga más de 8 caracteres.

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.

Conceptos relacionados

Fuentes técnicas consultadas