CHAR_LENGTH
La función CHAR_LENGTH, con su alias CHARACTER_LENGTH, devuelve la longitud de una cadena contada en caracteres, sin importar cuántos bytes ocupe cada uno. Es la función que coincide con la idea intuitiva de "cuántas letras tiene este texto", y por eso es la que debes usar para validar y contar longitudes de cara al usuario.
Su importancia se entiende mejor por contraste con LENGTH, que mide en bytes. En un mundo de texto solo ASCII, la distinción daría igual; pero las aplicaciones reales manejan tildes, eñes, caracteres de otros alfabetos y emojis, y ahí contar bytes en lugar de caracteres produce errores de validación molestos. En este artículo veremos su sintaxis, la diferencia práctica con LENGTH, varios usos habituales y un par de matices sobre el conteo de caracteres.
Sintaxis
CHAR_LENGTH recibe una cadena y devuelve el número de caracteres que contiene. CHARACTER_LENGTH es su alias y se comporta igual.
CHAR_LENGTH(cadena)
-- Alias:
CHARACTER_LENGTH(cadena)Diferencia con LENGTH
La forma más clara de entender CHAR_LENGTH es ponerla junto a LENGTH sobre un texto con caracteres acentuados. La palabra España tiene seis caracteres, pero ocupa siete bytes porque la ñ usa dos:
SELECT
CHAR_LENGTH('España') AS caracteres,
LENGTH('España') AS bytes;| caracteres | bytes |
|---|---|
| 6 | 7 |
El contraste es aún más llamativo con alfabetos como el japonés, donde cada carácter ocupa tres bytes en UTF-8. Tres caracteres se convierten en nueve bytes:
SELECT
CHAR_LENGTH('日本語') AS caracteres,
LENGTH('日本語') AS bytes;| caracteres | bytes |
|---|---|
| 3 | 9 |
Validar longitud mínima
Como CHAR_LENGTH cuenta lo que el usuario percibe como caracteres, es la función correcta para validaciones de longitud. Por ejemplo, localizar nombres demasiado cortos que podrían ser datos erróneos:
-- Validar longitud mínima de nombres
SELECT nombre, CHAR_LENGTH(nombre) AS caracteres
FROM clientes
WHERE CHAR_LENGTH(nombre) < 5;Lo mismo aplica a límites máximos, como el típico tope de caracteres de un campo de descripción o de un mensaje. Usar LENGTH aquí rechazaría injustamente textos con acentos.
Ordenar por longitud de caracteres
CHAR_LENGTH también sirve como criterio de ordenación cuando quieres priorizar textos por su número de caracteres, como los apellidos más largos:
SELECT nombre, apellidos,
CHAR_LENGTH(nombre) AS len_nombre,
CHAR_LENGTH(apellidos) AS len_apellidos
FROM clientes
ORDER BY len_apellidos DESC
LIMIT 5;| nombre | apellidos | len_nombre | len_apellidos |
|---|---|---|---|
| Carlos | Rodríguez Martín | 6 | 17 |
| Pedro | Fernández Castro | 5 | 16 |
| Ana | Martínez Ruiz | 3 | 14 |
| Javier | Moreno Díaz | 6 | 11 |
| Laura | López Sánchez | 5 | 14 |
Truncar con indicador
Un uso muy práctico es recortar textos largos añadiendo unos puntos suspensivos, lo que requiere medir primero la longitud. Combinando CHAR_LENGTH con CASE y LEFT se muestra el texto completo si es corto y una versión abreviada si supera cierto límite:
SELECT
nombre,
CASE
WHEN CHAR_LENGTH(nombre) > 10
THEN CONCAT(LEFT(nombre, 10), '...')
ELSE nombre
END AS nombre_corto
FROM productos
LIMIT 5;| nombre | nombre_corto |
|---|---|
| iPhone 15 Pro | iPhone 15 ... |
| MacBook Air M2 | MacBook Ai... |
| AirPods Pro | AirPods Pr... |
| iPad Air | iPad Air |
| Apple Watch Series 9 | Apple Watc... |
Aquí es importante usar CHAR_LENGTH y LEFT (que también trabaja por caracteres), porque mezclar el recorte con una medida en bytes podría partir un carácter multibyte por la mitad.
Estadísticas de longitud
Combinada con funciones de agregación, CHAR_LENGTH permite analizar la distribución de longitudes de una columna, algo útil para dimensionar campos o detectar anomalías:
SELECT
MIN(CHAR_LENGTH(nombre)) AS minima,
MAX(CHAR_LENGTH(nombre)) AS maxima,
AVG(CHAR_LENGTH(nombre)) AS promedio
FROM productos;CHAR_LENGTH con NULL, vacío y espacio
Conviene distinguir tres casos que se confunden con facilidad. NULL devuelve NULL (ausencia de dato); la cadena vacía devuelve 0; y una cadena con un solo espacio devuelve 1, porque el espacio es un carácter como cualquier otro:
SELECT
CHAR_LENGTH(NULL) AS nulo,
CHAR_LENGTH('') AS vacio,
CHAR_LENGTH(' ') AS espacio;| nulo | vacio | espacio |
|---|---|---|
| NULL | 0 | 1 |
Errores comunes
El error más extendido es usar LENGTH donde correspondía CHAR_LENGTH, lo que provoca validaciones que fallan con texto acentuado. Si tu aplicación maneja español u otros idiomas con caracteres no ASCII, la regla práctica es clara: para cualquier límite o conteo pensado en caracteres, usa CHAR_LENGTH.
Un matiz más sutil afecta a ciertos emojis y caracteres compuestos. Algunos símbolos que el usuario ve como uno solo están formados por varios puntos de código Unicode, y CHAR_LENGTH los cuenta por separado. Para texto convencional esto no supone problema, pero conviene saberlo si trabajas con contenido que incluye emojis modernos.
Cuándo usar CHAR_LENGTH
CHAR_LENGTH es la opción correcta siempre que cuentes o valides longitudes desde la perspectiva del usuario: límites de campos, recortes de texto, estadísticas de caracteres o cualquier regla expresada en "número de letras". Reserva LENGTH para los casos en que de verdad necesitas el tamaño en bytes, como el cálculo de almacenamiento.
En el siguiente artículo veremos LEFT, que extrae un número de caracteres desde el inicio de una cadena.
Escrito por Eduardo Lázaro
