3 min. de lectura (aproximado)

Char vs varchar en MySQL: la diferencia que impacta almacenamiento, rendimiento y consultas

(3 min. de lectura) En MySQL, la elección entre "CHAR" y "VARCHAR" influye directamente en el espacio ocupado, el rendimiento de las consultas y el comportamiento de las comparaciones.

Definición de cada tipo

CHAR

  • Tipo de longitud fija.
  • Almacena exactamente "n" caracteres. Si el valor es más corto, se rellena automáticamente con espacios a la derecha.
  • Resulta adecuado para valores de longitud constante, como códigos, flags o identificadores de tamaño fijo.

VARCHAR

  • Tipo de longitud variable.
  • Almacena únicamente los caracteres reales más 1 o 2 bytes de sobrecarga para indicar la longitud.
  • Resulta adecuado para datos cuya longitud varía, como nombres, descripciones o textos libres.

Ejemplo práctico

CREATE TABLE employee_codes (
    emp_id INT PRIMARY KEY,
    emp_code_char CHAR(5),
    emp_code_varchar VARCHAR(5),
    emp_name VARCHAR(50)
);

INSERT INTO employee_codes VALUES
(1, 'A1',   'A1',   'Alice'),
(2, 'B',    'B',    'Bob'),
(3, 'C123', 'C123', 'Carol'),
(4, 'D9',   'D9',   'David'),
(5, 'E',    'E',    'Eve');

Consulta de verificación

SELECT 
    emp_id,
    emp_code_char,
    CHAR_LENGTH(emp_code_char) AS char_length,
    LENGTH(emp_code_char) AS storage_bytes_char,
    emp_code_varchar,
    CHAR_LENGTH(emp_code_varchar) AS varchar_length,
    LENGTH(emp_code_varchar) AS storage_bytes_varchar
FROM employee_codes
ORDER BY emp_id;

Observaciones en MySQL

  • "CHAR(5)" ocupa siempre 5 bytes (en juegos de caracteres de un byte), independientemente de la longitud real del valor.
  • "VARCHAR(5)" ocupa únicamente los caracteres almacenados más la sobrecarga de longitud.
  • La función "CHAR_LENGTH()" no cuenta los espacios de relleno en ninguno de los dos casos.
  • Los espacios de relleno de "CHAR" se almacenan, aunque suelen ignorarse en las comparaciones según el collation utilizado.

Diferencias principales

Característica CHAR(n) VARCHAR(n)
Tipo de longitud Fija Variable
Almacenamiento Exactamente n caracteres Solo lo necesario + 1-2 bytes
Relleno (padding) Sí, con espacios No
Resultado de CHAR_LENGTH() Número de caracteres sin espacios finales Número de caracteres sin espacios finales
Uso típico Códigos y valores de longitud fija Textos de longitud variable
Longitud máxima (MySQL 8) 255 caracteres Hasta 65.535 bytes (según charset)

Criterios de selección

  • Se recomienda "CHAR" cuando la longitud de los valores es siempre la misma y se busca un comportamiento de almacenamiento predecible.
  • Se recomienda "VARCHAR" cuando la longitud de los datos varía y se prioriza el ahorro de espacio.
En tablas de gran volumen, el uso incorrecto de "CHAR" puede generar un consumo innecesario de almacenamiento, mientras que el uso de "VARCHAR" en campos de longitud fija añade una pequeña sobrecarga por cada fila.