LENGTH
La función LENGTH devuelve la longitud de una cadena medida en bytes. Este matiz, "en bytes" y no "en caracteres", es la clave para usarla correctamente y la diferencia esencial respecto a CHAR_LENGTH, que cuenta caracteres. Con texto ASCII puro ambas coinciden, pero en cuanto aparecen tildes, eñes o cualquier carácter multibyte de UTF-8, los resultados divergen.
Saber que LENGTH razona en bytes es importante en escenarios concretos: calcular el espacio de almacenamiento que ocupa un texto, comprobar límites de transmisión, o entender por qué un valor que parece caber en una columna en realidad la desborda. En este artículo veremos su sintaxis, su comportamiento con la cadena vacía y NULL, la comparación detallada con CHAR_LENGTH y los usos donde medir en bytes tiene sentido.
Sintaxis
LENGTH recibe una cadena y devuelve un número entero con su tamaño en bytes.
LENGTH(cadena)Ejemplo básico
Con texto ASCII, donde cada carácter ocupa un byte, el resultado coincide con el número de caracteres que ves:
SELECT LENGTH('Hola mundo') AS longitud;| longitud |
|---|
| 10 |
Conviene distinguir dos casos límite que a menudo se confunden: la cadena vacía tiene longitud 0, mientras que NULL produce NULL, no 0. Son situaciones distintas (un dato presente pero vacío frente a la ausencia de dato) y LENGTH las refleja:
SELECT LENGTH('') AS vacia, LENGTH(NULL) AS nula;| vacia | nula |
|---|---|
| 0 | NULL |
LENGTH vs CHAR_LENGTH
Aquí está la diferencia fundamental. Con caracteres ASCII de un byte, ambas funciones devuelven lo mismo; pero con caracteres UTF-8 multibyte, LENGTH cuenta los bytes y CHAR_LENGTH los caracteres:
SELECT
LENGTH('café') AS bytes_cafe,
CHAR_LENGTH('café') AS chars_cafe,
LENGTH('niño') AS bytes_nino,
CHAR_LENGTH('niño') AS chars_nino;| bytes_cafe | chars_cafe | bytes_nino | chars_nino |
|---|---|---|---|
| 5 | 4 | 5 | 4 |
La é y la ñ ocupan 2 bytes cada una en UTF-8 pero son 1 solo carácter, de ahí la diferencia de uno entre ambas medidas. Esta comparación, además, sirve como truco práctico: si LENGTH y CHAR_LENGTH difieren, el texto contiene caracteres no ASCII.
Longitud de nombres de productos
Aplicada sobre columnas, LENGTH permite ver el tamaño en bytes de cada valor. Mostrarla junto a CHAR_LENGTH deja claro cuándo un nombre tiene solo caracteres ASCII (ambas columnas iguales):
SELECT nombre, LENGTH(nombre) AS bytes, CHAR_LENGTH(nombre) AS caracteres
FROM productos
LIMIT 5;| nombre | bytes | caracteres |
|---|---|---|
| iPhone 15 Pro | 13 | 13 |
| MacBook Air M2 | 14 | 14 |
| AirPods Pro | 11 | 11 |
| iPad Air | 8 | 8 |
| Apple Watch Series 9 | 20 | 20 |
Filtrar y ordenar por longitud
LENGTH se puede usar en el WHERE para filtrar por tamaño, por ejemplo para localizar nombres especialmente cortos:
-- Productos con nombre corto (menos de 12 bytes)
SELECT nombre, LENGTH(nombre) AS longitud
FROM productos
WHERE LENGTH(nombre) < 12;| nombre | longitud |
|---|---|
| AirPods Pro | 11 |
| iPad Air | 8 |
También sirve como criterio en ORDER BY para colocar primero los textos más largos. Ten presente que, igual que con otras funciones aplicadas a una columna, ordenar o filtrar por LENGTH(columna) impide aprovechar un índice sobre esa columna, lo que penaliza el rendimiento en tablas grandes:
SELECT nombre, LENGTH(nombre) AS longitud
FROM productos
ORDER BY LENGTH(nombre) DESC
LIMIT 5;LENGTH con números
Si le pasas un número, LENGTH lo convierte primero a su representación textual y luego cuenta los bytes de esa cadena. Así, el punto decimal y los dígitos cuentan como caracteres:
SELECT
LENGTH(12345) AS entero,
LENGTH(3.14) AS decimal_num,
LENGTH(1299.99) AS precio;| entero | decimal_num | precio |
|---|---|---|
| 5 | 4 | 7 |
Errores comunes
El error más serio es usar LENGTH para validar límites de longitud pensados en caracteres, como "el nombre no puede superar los 50 caracteres". Si el texto contiene tildes o eñes, LENGTH devolverá más bytes que caracteres y rechazará valores que en realidad son válidos. Para esa clase de validaciones, la función correcta es CHAR_LENGTH.
El otro punto de confusión es con el tipo de columna. Una columna VARCHAR(50) limita a 50 caracteres, no a 50 bytes, así que su capacidad en bytes es mayor con texto multibyte. Mezclar la lógica de bytes de LENGTH con el límite en caracteres de la columna lleva a conclusiones equivocadas sobre si un dato cabe o no.
Cuándo usar LENGTH
LENGTH es la función adecuada cuando lo que de verdad te interesa es el tamaño en bytes: estimar almacenamiento, controlar límites de transmisión o detectar la presencia de caracteres multibyte comparándola con CHAR_LENGTH. Para cualquier validación o conteo orientado a caracteres visibles, usa CHAR_LENGTH, que es lo que el usuario percibe como "longitud".
En el siguiente artículo veremos CHAR_LENGTH, la versión que cuenta caracteres en lugar de bytes.
Escrito por Eduardo Lázaro
