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;
caracteresbytes
67

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;
caracteresbytes
39

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;
nombreapellidoslen_nombrelen_apellidos
CarlosRodríguez Martín617
PedroFernández Castro516
AnaMartínez Ruiz314
JavierMoreno Díaz611
LauraLópez Sánchez514

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;
nombrenombre_corto
iPhone 15 ProiPhone 15 ...
MacBook Air M2MacBook Ai...
AirPods ProAirPods Pr...
iPad AiriPad Air
Apple Watch Series 9Apple 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;
nulovacioespacio
NULL01

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