REPLACE
La función REPLACE sustituye todas las apariciones de un texto por otro dentro de una cadena. Es la herramienta de reemplazo más directa de MySQL y se usa constantemente para limpiar datos, normalizar formatos y generar valores derivados como slugs para URLs.
Hay dos características que definen su comportamiento y conviene grabarlas desde el principio: reemplaza todas las ocurrencias, no solo la primera, y distingue mayúsculas de minúsculas en la búsqueda, a diferencia de otras funciones de cadena cuya sensibilidad depende de la colación. Además, no debe confundirse con la sentencia REPLACE INTO, que es otra cosa completamente distinta (una variante de INSERT). En este artículo veremos la función REPLACE de cadenas: su sintaxis, sus usos prácticos, su distinción de mayúsculas y cómo encadenar varios reemplazos.
Sintaxis
REPLACE recibe tres argumentos: la cadena original, el texto a buscar y el texto por el que sustituirlo.
REPLACE(cadena, texto_buscar, texto_reemplazo)Su comportamiento se resume en dos reglas que la diferencian de otras funciones:
- Distingue mayúsculas y minúsculas: solo sustituye coincidencias exactas de caso
- Reemplaza todas las ocurrencias, no solo la primera
Ejemplo básico
En su uso más simple, sustituye cada aparición del texto buscado. Observa que las dos apariciones de 'mundo' se reemplazan, no solo la primera:
SELECT REPLACE('Hola mundo mundo', 'mundo', 'MySQL') AS resultado;| resultado |
|---|
| Hola MySQL MySQL |
Es muy habitual usarla para cambiar separadores, como convertir guiones en espacios:
SELECT REPLACE('abc-def-ghi', '-', ' ') AS resultado;| resultado |
|---|
| abc def ghi |
Limpiar datos de productos
Sobre columnas, REPLACE transforma cada valor. Un caso típico es preparar nombres para usarlos en una URL, sustituyendo los espacios por guiones:
SELECT
nombre,
REPLACE(nombre, ' ', '-') AS slug
FROM productos
LIMIT 5;| nombre | slug |
|---|---|
| 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 |
Generar URLs amigables
Para un slug completo se combinan varias operaciones: anidar dos REPLACE (uno para los espacios y otro para eliminar puntos) y envolverlo en LOWER para pasarlo todo a minúsculas. El orden importa, ya que cada REPLACE actúa sobre el resultado del anterior:
SELECT
nombre,
LOWER(REPLACE(REPLACE(nombre, ' ', '-'), '.', '')) AS url_slug
FROM productos
LIMIT 5;| nombre | url_slug |
|---|---|
| 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 |
REPLACE en UPDATE
Donde REPLACE resulta más potente es en un UPDATE, para corregir datos de forma masiva. Por ejemplo, migrar todos los emails de un dominio antiguo a uno nuevo de una sola pasada:
-- Cambiar dominio de emails (ejemplo)
-- UPDATE clientes SET email = REPLACE(email, '@viejo.com', '@nuevo.com');Conviene ejecutar este tipo de actualización con cautela y, si es posible, dentro de una transacción o tras un respaldo, porque modifica los datos de forma permanente y afecta a todas las filas que contengan el texto buscado.
Eliminar caracteres
Para eliminar un carácter en lugar de sustituirlo, basta con reemplazarlo por una cadena vacía. Es la forma habitual de limpiar formatos, como quitar los guiones de un número de teléfono:
SELECT REPLACE('(612) 345-678', '-', '') AS sin_guiones;| sin_guiones |
|---|
| (612) 345678 |
Anidando varios REPLACE se eliminan distintos caracteres en una sola expresión, por ejemplo guiones y espacios a la vez:
SELECT REPLACE(REPLACE('(612) 345-678', '-', ''), ' ', '') AS limpio;| limpio |
|---|
| (612)345678 |
REPLACE distingue mayúsculas
A diferencia de funciones como INSTR, cuya sensibilidad depende de la colación, REPLACE siempre distingue mayúsculas y minúsculas en la búsqueda. En el siguiente ejemplo solo se sustituye 'hola' en minúsculas; ni 'Hola' ni 'HOLA' se tocan:
SELECT
REPLACE('Hola hola HOLA', 'hola', 'X') AS resultado;| resultado |
|---|
| Hola X HOLA |
Cuando necesites un reemplazo que ignore el caso, una opción es normalizar primero con LOWER, aunque eso cambia el resto del texto, y la solución más limpia suele ser REGEXP_REPLACE, que permite hacer coincidencias insensibles a mayúsculas y patrones más complejos.
REPLACE con NULL
Si la cadena de entrada es NULL, el resultado es NULL, siguiendo la regla general de propagación de nulos:
SELECT REPLACE(NULL, 'a', 'b') AS resultado;| resultado |
|---|
| NULL |
Reemplazos anidados
Anidar REPLACE permite aplicar varias sustituciones distintas en una sola expresión, cada una sobre el resultado de la anterior. Aquí se transforman tres caracteres diferentes de una vez:
SELECT REPLACE(REPLACE(REPLACE('a.b.c', 'a', '1'), 'b', '2'), 'c', '3') AS resultado;| resultado |
|---|
| 1.2.3 |
Errores comunes
El error más frecuente es esperar que REPLACE admita comodines o patrones, como hace LIKE. No es así: busca y sustituye texto literal, exacto. Si necesitas reemplazar según un patrón (por ejemplo, "cualquier secuencia de dígitos"), la herramienta adecuada es REGEXP_REPLACE.
El segundo descuido tiene que ver con la distinción de mayúsculas: como REPLACE solo sustituye coincidencias exactas de caso, es fácil que se queden sin reemplazar variantes del texto que no esperabas, como una palabra con la inicial en mayúscula al principio de una frase.
Cuándo usar REPLACE
REPLACE es la opción idónea para sustituciones de texto literal: limpiar formatos, cambiar separadores, eliminar caracteres concretos o generar slugs. Cuando la sustitución dependa de un patrón o deba ignorar mayúsculas, recurre a REGEXP_REPLACE; y si lo que quieres es insertar texto en una posición concreta sin buscar nada, la función adecuada es INSERT.
En el siguiente artículo veremos la función INSERT, que inserta o reemplaza texto en una posición específica de la cadena.
Escrito por Eduardo Lázaro
