REVERSE
La función REVERSE invierte el orden de los caracteres de una cadena: el último pasa a ser el primero y viceversa. Es una función sencilla, y en el día a día se usa poco de forma directa, pero conoce una aplicación muy valiosa en el rendimiento de búsquedas por sufijo que veremos al final del artículo y que justifica por sí sola conocerla bien.
Un punto importante de partida es que, en las versiones actuales de MySQL, REVERSE opera sobre caracteres, no sobre bytes. Esto significa que invierte correctamente texto en UTF-8 con tildes, eñes o emojis, sin partir un carácter multibyte por la mitad. En este artículo veremos su sintaxis, su comportamiento con NULL, un par de usos ilustrativos y la técnica de indexación por sufijo, que es donde REVERSE aporta un valor real.
Sintaxis
REVERSE recibe una única cadena y devuelve esa cadena con sus caracteres en orden inverso.
REVERSE(cadena)Ejemplo básico
El funcionamiento es inmediato: la función devuelve la cadena leída de derecha a izquierda.
SELECT REVERSE('Hola') AS resultado;| resultado |
|---|
| aloH |
Conviene fijarse en que REVERSE invierte el orden respetando mayúsculas y minúsculas de cada carácter; no cambia el contenido, solo la posición:
SELECT REVERSE('MySQL') AS resultado;| resultado |
|---|
| LQSyM |
Comportamiento con NULL
Como la mayoría de las funciones de cadena en MySQL, REVERSE propaga el valor NULL: si la entrada es NULL, el resultado también lo es, sin lanzar ningún error. Es importante tenerlo presente al aplicarla sobre columnas que admitan nulos.
SELECT REVERSE(NULL) AS resultado;| resultado |
|---|
| NULL |
Comprobar palíndromos
Un uso clásico para ilustrar la función es detectar palíndromos, palabras que se leen igual en ambos sentidos, comparando la cadena con su versión invertida. Para que la comparación no dependa de mayúsculas, conviene combinarla con LOWER:
SELECT
'anilina' AS palabra,
REVERSE('anilina') AS invertida,
'anilina' = REVERSE('anilina') AS es_palindromo;| palabra | invertida | es_palindromo |
|---|---|---|
| anilina | anilina | 1 |
Sobre un texto que no es palíndromo, la comparación da falso. Observa cómo aquí LOWER se aplica a ambos lados para que la diferencia de mayúsculas no afecte al resultado:
SELECT
'MySQL' AS palabra,
REVERSE('MySQL') AS invertida,
LOWER('MySQL') = LOWER(REVERSE('MySQL')) AS es_palindromo;| palabra | invertida | es_palindromo |
|---|---|---|
| MySQL | LQSyM | 0 |
Uso práctico: búsquedas por sufijo con índice
Aquí está la aplicación que de verdad merece la pena. Un índice en MySQL solo acelera las búsquedas por prefijo: LIKE 'abc%' puede usar el índice, pero LIKE '%abc' no, porque el motor no sabe por dónde empezar a buscar. Esto es un problema cuando necesitas buscar por el final de un valor, como el dominio de un email, la extensión de un archivo o los últimos dígitos de un número.
La solución es guardar en una columna adicional la versión invertida del valor con REVERSE, indexarla, y convertir así una búsqueda por sufijo en una búsqueda por prefijo sobre la columna invertida. Por ejemplo, para encontrar todos los emails de un mismo dominio de forma eficiente:
-- Columna invertida indexada (esquema)
-- ALTER TABLE clientes ADD email_invertido VARCHAR(100)
-- GENERATED ALWAYS AS (REVERSE(email)) STORED;
-- CREATE INDEX idx_email_inv ON clientes (email_invertido);
-- Buscar dominio usando el índice (prefijo sobre la columna invertida)
SELECT email
FROM clientes
WHERE email_invertido LIKE REVERSE('@gmail.com%');De este modo, una búsqueda que de otra forma obligaría a recorrer toda la tabla puede apoyarse en un índice. Esta técnica, combinada con columnas generadas, es la razón principal por la que REVERSE resulta útil más allá de los ejemplos didácticos.
Errores comunes
El error más extendido es asumir que REVERSE trabaja a nivel de byte y que, por tanto, corrompe el texto multibyte. En las versiones modernas de MySQL no es así: invierte por caracteres y respeta UTF-8. Aun así, conviene comprobarlo si trabajas con conjuntos de caracteres o colaciones poco habituales.
Otro malentendido es esperar que REVERSE invierta el orden de las palabras de una frase. La función invierte caracteres, no palabras: aplicada a 'Hola mundo' devuelve 'odnum aloH', no 'mundo Hola'. Para reordenar palabras hay que recurrir a otras técnicas, como dividir la cadena y recomponerla.
Cuándo usar REVERSE
En la práctica, REVERSE rara vez es la solución directa a un problema de negocio, pero brilla en un escenario muy concreto: optimizar búsquedas por sufijo mediante una columna invertida e indexada. Fuera de ese caso, suele aparecer en validaciones puntuales o como pieza intermedia de transformaciones de texto más complejas. Para buscar patrones dentro de cadenas de forma flexible, suele ser más adecuado recurrir a las expresiones regulares.
En el siguiente artículo veremos REPEAT, que permite repetir una cadena un número determinado de veces.
Escrito por Eduardo Lázaro
