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.