LOWER
La función LOWER convierte todos los caracteres alfabéticos de una cadena a minúsculas, dejando intactos los números, espacios y signos de puntuación. La función LCASE es exactamente su alias: hacen lo mismo y puedes usar la que prefieras, aunque LOWER es la forma estándar y más extendida.
Su utilidad principal es la normalización de datos para que las comparaciones y los almacenamientos sean consistentes. Sin embargo, hay un matiz de rendimiento que mucha gente desconoce y que veremos en detalle: en MySQL, la sensibilidad a mayúsculas no la decide LOWER, sino la colación de la columna, y aplicar LOWER sin necesidad puede impedir el uso de índices. En este artículo veremos la sintaxis, los casos prácticos donde sí aporta valor y los errores típicos al usarla en consultas.
Sintaxis
LOWER recibe una cadena y devuelve esa misma cadena en minúsculas. LCASE es su alias directo.
LOWER(cadena)
-- Alias:
LCASE(cadena)Ejemplo básico
El comportamiento es inmediato: cualquier letra mayúscula se transforma en su equivalente minúscula.
SELECT LOWER('HOLA MUNDO') AS resultado;| resultado |
|---|
| hola mundo |
Los caracteres que no son letras, como las cifras o los puntos, se mantienen sin cambios, lo que permite aplicar LOWER a textos mixtos sin temor a alterar la parte numérica:
SELECT LOWER('MySQL 8.0') AS resultado;| resultado |
|---|
| mysql 8.0 |
Normalizar datos para mostrar
Aplicada sobre una columna, LOWER devuelve la versión en minúsculas de cada valor sin modificar la tabla. Es habitual usarla para presentar datos de forma uniforme:
SELECT nombre, LOWER(nombre) AS nombre_lower
FROM productos
LIMIT 5;| nombre | nombre_lower |
|---|---|
| iPhone 15 Pro | iphone 15 pro |
| MacBook Air M2 | macbook air m2 |
| AirPods Pro | airpods pro |
| iPad Air | ipad air |
| Apple Watch Series 9 | apple watch series 9 |
Búsqueda sin distinguir mayúsculas: el matiz importante
Aquí está el punto que conviene entender bien. Las colaciones por defecto de MySQL, como utf8mb4_0900_ai_ci, terminan en _ci (case insensitive), lo que significa que las comparaciones ya ignoran las mayúsculas. En la práctica, WHERE email = 'maria@email.com' encontrará igualmente un valor guardado como 'Maria@Email.com' sin necesidad de LOWER.
-- Con colación _ci, esto ya es insensible a mayúsculas por sí solo
SELECT nombre, email
FROM clientes
WHERE LOWER(email) = 'maria.garcia@email.com';El problema es que envolver la columna en LOWER dentro del WHERE impide que MySQL use un índice sobre email, porque el índice almacena los valores originales, no su versión en minúsculas. En tablas grandes esto puede convertir una búsqueda instantánea en un recorrido completo. Por tanto, con colaciones _ci, lo más eficiente suele ser comparar directamente sin LOWER. La función es realmente necesaria solo cuando trabajas con una colación sensible a mayúsculas (_cs o binaria) y quieres forzar una comparación insensible.
Normalizar al insertar
El lugar donde LOWER aporta un valor indiscutible es en el momento de guardar los datos. Almacenar siempre los emails en minúsculas garantiza una representación canónica, evita duplicados que solo difieren en mayúsculas y simplifica integraciones con sistemas externos que sí distinguen mayúsculas. Los campos VARCHAR admiten cualquier combinación, así que conviene normalizar en la inserción:
-- Guardar emails siempre en minúsculas
INSERT INTO clientes (nombre, apellidos, email, telefono)
VALUES ('Test', 'Usuario', LOWER('Test.Usuario@Email.COM'), '600000000');-- Limpieza
DELETE FROM clientes WHERE nombre = 'Test' AND apellidos = 'Usuario';LOWER con caracteres acentuados
LOWER convierte correctamente las letras acentuadas y la eñe, siempre que la columna use un conjunto de caracteres adecuado como utf8mb4. El resultado conserva los acentos, solo cambia el caso:
SELECT LOWER('ESPAÑA') AS resultado;| resultado |
|---|
| españa |
Conviene saber, no obstante, que la conversión de mayúsculas depende de la colación y, con ello, del idioma. En ciertos idiomas la correspondencia entre mayúsculas y minúsculas no es trivial, por lo que en aplicaciones multilingües es recomendable verificar el comportamiento con tus datos reales.
LOWER con NULL
Como el resto de funciones de cadena, LOWER propaga el valor NULL: si la entrada es nula, la salida también lo es.
SELECT LOWER(NULL) AS resultado;| resultado |
|---|
| NULL |
Errores comunes
El error de rendimiento más frecuente, ya comentado, es usar LOWER sobre una columna indexada en el WHERE cuando la colación ya es insensible a mayúsculas: no aporta nada y anula el índice. Si de verdad necesitas comparaciones insensibles con una colación sensible, una alternativa más eficiente es definir la columna con una colación _ci o crear una columna generada en minúsculas e indexarla.
El otro malentendido es esperar que LOWER modifique los datos almacenados. No lo hace: devuelve un valor nuevo. Para cambiar la tabla de forma permanente necesitas un UPDATE que asigne LOWER(columna) a la propia columna.
Cuándo usar LOWER
LOWER es la opción correcta para normalizar datos en el momento de insertarlos, para mostrar texto de forma uniforme y para forzar comparaciones insensibles cuando trabajas con colaciones sensibles a mayúsculas. En cambio, con las colaciones _ci por defecto de MySQL, evita aplicarlo dentro del WHERE sobre columnas indexadas, porque la comparación ya ignora el caso y solo conseguirías penalizar el rendimiento.
En el siguiente artículo veremos UPPER, la función simétrica que convierte el texto a mayúsculas.
Escrito por Eduardo Lázaro
