Cómo reemplazar cadenas en MySQL: REPLACE() y REGEXP_REPLACE() (MySQL 8.0+)

目次

Introducción

Al trabajar con MySQL, no es raro encontrarse con situaciones como “quiero reemplazar solo una cadena específica en toda una tabla” o “necesito corregir datos incorrectos en bloque”. Por ejemplo, cuando una URL usada en descripciones de productos en un sitio de comercio electrónico cambia, cuando deseas corregir errores de ingreso pasados de una sola vez, o cuando necesitas estandarizar el formato (p. ej., convertir guiones en barras), a menudo necesitarás reemplazo de cadenas.

En este artículo explicamos a fondo métodos y técnicas prácticos para reemplazar cadenas en MySQL, desde lo básico hasta usos avanzados. Aprenderás los fundamentos de la función REPLACE() más utilizada, junto con ejemplos del mundo real, formas eficientes de realizar múltiples reemplazos y reemplazo avanzado mediante expresiones regulares.

También cubrimos las diferencias en las funciones disponibles según la versión de MySQL que uses, precauciones importantes para evitar pérdidas accidentales de datos y consideraciones de rendimiento—ofreciendo información realmente útil en entornos reales.

Después de leer este artículo, podrás resolver todas las siguientes preguntas y desafíos:

  • ¿Cuál es la forma más fácil de reemplazar una cadena específica en MySQL?
  • ¿Cómo puedo reemplazar varios patrones en bloque?
  • ¿Es posible un reemplazo flexible usando expresiones regulares?
  • ¿Cuáles son los riesgos y precauciones al actualizar una gran cantidad de datos de una sola vez?
  • ¿Cómo puedo hacer copias de seguridad de los datos para prevenir fallos?

Este contenido es ideal para todos, desde principiantes hasta profesionales que desean dominar con confianza el reemplazo de cadenas en MySQL.

Conceptos básicos de reemplazo de cadenas en MySQL (función REPLACE)

Si deseas reemplazar cadenas en MySQL, la herramienta más utilizada es la función REPLACE(). REPLACE() busca un patrón específico dentro de una cadena o valor de columna dado y lo sustituye en bloque por otra cadena.
Resulta útil en muchas situaciones, incluidos arreglos rutinarios de datos y conversiones masivas por lotes en bases de datos.

Sintaxis básica de REPLACE()

REPLACE(original_string, search_string, replacement_string)
  • original_string : La cadena a modificar, o el nombre de una columna de tabla.
  • search_string : La parte que deseas reemplazar.
  • replacement_string : La nueva cadena a insertar.

Por ejemplo:

SELECT REPLACE('I love MySQL!', 'MySQL', 'PostgreSQL');

Esta consulta busca “MySQL” en la cadena “I love MySQL!” y la reemplaza por “PostgreSQL”,
de modo que el resultado se convierte en “I love PostgreSQL!”.

Sensibilidad a mayúsculas y minúsculas

REPLACE() realiza la búsqueda y el reemplazo de forma sensible a mayúsculas y minúsculas. Por ejemplo, “mysql” y “MySQL” se tratan como cadenas diferentes.
Si la cadena objetivo no se encuentra, se devuelve la cadena original tal cual.

Tipos de datos compatibles

REPLACE() puede usarse con columnas de texto comunes como CHAR, VARCHAR y TEXT. Sin embargo, ten cuidado con tipos de datos especiales como BLOB, ya que su comportamiento puede no ser el esperado.

De esta manera, REPLACE() resulta atractivo porque es simple e intuitivo de usar.
En las siguientes secciones explicaremos ejemplos prácticos de SQL usando REPLACE() y cómo aplicarlo a los datos de una tabla.

Uso básico y ejemplos prácticos

Aunque REPLACE() es muy sencillo, en el trabajo real a menudo necesitas “reemplazar cadenas en una columna de base de datos en bloque”. Aquí explicaremos operaciones básicas con REPLACE() y cómo corregir datos de tabla por lotes mediante ejemplos concretos de SQL.

Reemplazo simple de cadena con SELECT

Primero, aquí está el uso más básico: reemplazar texto en una cadena específica.

SELECT REPLACE('Hello, mysql user!', 'mysql', 'MySQL');

Esta consulta reemplaza “mysql” por “MySQL”, devolviendo “Hello, MySQL user!”.

Reemplazo masivo en una columna de tabla con UPDATE

Un caso de uso real común es reemplazar cadenas en una columna específica de una tabla.
Por ejemplo, si deseas actualizar todas las ocurrencias del dominio antiguo oldsite.com al nuevo dominio newsite.com en las descripciones de productos, puedes ejecutar el siguiente SQL:

UPDATE products
SET description = REPLACE(description, 'oldsite.com', 'newsite.com');

Este SQL reemplaza cada ocurrencia de “oldsite.com” en la columna description de la tabla products con “newsite.com”.

Precauciones al ejecutar

Un UPDATE que usa REPLACE() se ejecuta contra todos los registros, lo que implica el riesgo de sobrescribir más de lo previsto.
Antes de ejecutarlo en producción, siempre realiza una copia de seguridad y verifica el comportamiento en un entorno de pruebas.

Limitar el impacto con una cláusula WHERE

Si solo deseas corregir un subconjunto de datos, usa una cláusula WHERE. Por ejemplo, para dirigirte únicamente a los productos añadidos en 2024 o después:

UPDATE products
SET description = REPLACE(description, 'oldsite.com', 'newsite.com')
WHERE created_at >= '2024-01-01';

Esto ayuda a evitar sobrescrituras innecesarias.

Una vez que comprendas estos conceptos básicos, las operaciones diarias y las tareas de limpieza de datos se vuelven mucho más eficientes.

Colección de ejemplos de casos de uso comunes

REPLACE() es útil en muchas situaciones reales donde piensas: “¿Puedo reemplazar esto?” A continuación, ejemplos prácticos para casos de uso comunes.

1. Corrección de errores tipográficos y texto mal escrito

Por ejemplo, es útil cuando deseas corregir errores frecuentes de entrada en bloque.

UPDATE users
SET profile = REPLACE(profile, 'htto://', 'http://');

Este lote SQL corrige la entrada errónea “htto://” a “http://”.

2. Reemplazo masivo de URLs o dominios

Esto es útil cuando rediseñas o migras un sitio web y deseas sustituir un dominio antiguo por uno nuevo en todos tus datos.

UPDATE blog_posts
SET content = REPLACE(content, 'old-domain.jp', 'new-domain.jp');

3. Eliminación de espacios, saltos de línea o símbolos no deseados

Si hay espacios o códigos de salto de línea mezclados en tus datos, puedes eliminarlos en bloque con REPLACE().

UPDATE addresses
SET zipcode = REPLACE(zipcode, ' ', '');

Este ejemplo elimina todos los espacios de los códigos postales. Para los saltos de línea, especifica '\n' o '\r'.

4. Estandarización de formatos (guión a barra, ancho completo a medio, etc.)

También puedes estandarizar formatos de datos fácilmente con REPLACE().

UPDATE products
SET code = REPLACE(code, '-', '/');

Si deseas convertir caracteres de ancho completo a medio en bloque, puedes anidar REPLACE() varias veces.

5. Reemplazo de múltiples patrones a la vez

Si quieres reemplazar varios patrones simultáneamente, anida llamadas a REPLACE().

UPDATE contacts
SET note = REPLACE(REPLACE(note, '株式会社', '(株)'), '有限会社', '(有)');

Esto convierte “株式会社” y “有限会社” en sus formas abreviadas de una sola vez.

REPLACE() es una función poderosa para manejar eficientemente tareas que requieren “muchas ediciones” y que serían dolorosas de hacer manualmente.

Técnicas avanzadas y cómo evitar problemas

REPLACE() es muy conveniente, pero según cómo lo uses, podrías encontrarte con problemas inesperados —o podrías operar de manera mucho más eficiente. Aquí explicamos técnicas avanzadas prácticas y consejos para prevenir problemas.

1. Manejo de valores NULL

Si la columna objetivo es NULL, REPLACE() devuelve NULL también. Esto puede dejar los datos sin cambios de forma inesperada. Si deseas asegurar que el reemplazo se aplique incluso cuando existen valores NULL, combínalo con IFNULL().

UPDATE users
SET comment = REPLACE(IFNULL(comment, ''), 'NGワード', '***');

Esto trata NULL como una cadena vacía, de modo que el reemplazo se aplicará.

2. Reemplazo sin distinción de mayúsculas y minúsculas

REPLACE() distingue entre mayúsculas y minúsculas por defecto. Si deseas reemplazar tanto variantes en mayúsculas como en minúsculas, es común combinar LOWER() / UPPER() para la comparación y realizar el reemplazo en dos pasadas según sea necesario.

UPDATE articles
SET title = REPLACE(REPLACE(title, 'MySQL', 'MariaDB'), 'mysql', 'MariaDB');

3. Reemplazo de varios pasos (REPLACE anidado)

Si deseas reemplazar varios patrones diferentes a la vez, anida llamadas a REPLACE().

UPDATE logs
SET message = REPLACE(REPLACE(message, 'error', 'warning'), 'fail', 'caution');

4. Limita el impacto con UPDATE + WHERE

En lugar de actualizar todos los datos de una vez, usa una cláusula WHERE para dirigirte solo a las filas que necesitas.

UPDATE customers
SET email = REPLACE(email, '@oldmail.com', '@newmail.com')
WHERE registered_at >= '2023-01-01';

5. Siempre verifica en un entorno de pruebas y realiza copias de seguridad

Las actualizaciones con REPLACE() a menudo son difíciles de revertir. Antes de ejecutarlas en producción, siempre haz una copia de seguridad. Probar exhaustivamente con datos de muestra o en un entorno de pruebas reduce enormemente el riesgo.

Aplicando REPLACE() correctamente, puedes realizar tareas de reemplazo de cadenas de forma más segura y eficiente.

Reemplazo de cadenas con expresiones regulares (solo MySQL 8.0+)

En MySQL 8.0 y versiones posteriores, puedes usar no solo REPLACE() sino también REGEXP_REPLACE() para realizar reemplazos avanzados mediante expresiones regulares. Esto permite una coincidencia de patrones flexible y una depuración de datos eficiente para casos complejos.

Sintaxis básica de REGEXP_REPLACE()

REGEXP_REPLACE(original_string, regex_pattern, replacement_string)
  • original_string : La cadena o nombre de columna a modificar.
  • regex_pattern : El patrón a coincidir (p.ej., [0-9]{3}-[0-9]{4} ).
  • replacement_string : La nueva cadena a insertar.

Ejemplo 1: Eliminar guiones de números de teléfono

Si deseas eliminar todos los guiones de los números de teléfono, puedes escribir:

UPDATE users
SET tel = REGEXP_REPLACE(tel, '-', '');

Ejemplo 2: Estandarizar el formato del código postal

Las expresiones regulares también son útiles para estandarizar códigos postales en diferentes formatos (p.ej., “123-4567” y “1234567”).

UPDATE addresses
SET zipcode = REGEXP_REPLACE(zipcode, '([0-9]{3})-?([0-9]{4})', '\1-\2');

Esta consulta SQL estandariza tanto “1234567” como “123-4567” al formato “123-4567”.

Ejemplo 3: Eliminar caracteres no alfanuméricos

También puedes eliminar todos los caracteres que no sean letras ni dígitos.

UPDATE records
SET code = REGEXP_REPLACE(code, '[^a-zA-Z0-9]', '');

Esto elimina todos los caracteres no alfanuméricos de la columna code.

Cómo comprobar tu versión de MySQL

REGEXP_REPLACE() está disponible solo en MySQL 8.0 y posteriores. Puedes comprobar tu versión actual de MySQL con esta consulta:

SELECT VERSION();

Si estás usando una versión anterior como MySQL 5.x, REGEXP_REPLACE() no está disponible, por lo que considera usar REPLACE() o realizar el reemplazo en el lado de la aplicación.

El reemplazo basado en expresiones regulares es extremadamente potente cuando los patrones de datos varían mucho o cuando se requieren transformaciones complejas.

Comparación con otras funciones de cadena y notas

MySQL ofrece varias funciones de cadena útiles. Dado que cada función tiene propósitos y características diferentes, es importante elegir la mejor para tareas de reemplazo y edición. Aquí comparamos funciones comunes como REPLACE(), REGEXP_REPLACE(), INSERT() y CONCAT().

1. REPLACE

  • Caso de uso : Reemplazar una subcadena de “coincidencia exacta” dentro de una cadena o columna con otra cadena.
  • Características : Sensible a mayúsculas/minúsculas; la más sencilla para reemplazos simples.
  • Ejemplo : SELECT REPLACE('cat and dog', 'cat', 'fox'); -- → "fox and dog"

2. REGEXP_REPLACE (MySQL 8.0+)

  • Caso de uso : Reemplazar partes que coincidan con un patrón de expresión regular.
  • Características : Ideal para coincidencias de patrones complejos, reemplazo de múltiples patrones y extracción/edición parcial.
  • Ejemplo : SELECT REGEXP_REPLACE('a123b456c', '[a-z]', ''); -- → "123456"

3. INSERT

  • Caso de uso : “Insertar” una cadena sobrescribiendo una longitud especificada a partir de una posición determinada.
  • Características : Adecuado para reemplazo/inserción parcial, pero más parecido a sobrescribir que al reemplazo típico.
  • Ejemplo : SELECT INSERT('abcdef', 2, 3, 'XYZ'); -- → "aXYZef"

4. CONCAT

  • Caso de uso : “Concatenar” múltiples cadenas o valores de columna.
  • Características : No es para reemplazo/edición; se usa para unir cadenas.
  • Ejemplo : SELECT CONCAT('abc', '123'); -- → "abc123"

5. SUBSTRING / LEFT / RIGHT

  • Caso de uso : Extraer una parte de una cadena.
  • Características : Ideal para segmentar y extraer fragmentos de datos.
  • Ejemplo : SELECT SUBSTRING('abcdef', 2, 3); -- → "bcd"

Tabla de comparación rápida

FeatureReplacementRegex ReplacementInsert/OverwriteConcatenationSubstring Extraction
FunctionREPLACEREGEXP_REPLACEINSERTCONCATSUBSTRING, etc.
Pattern support× (exact match only)○ (regex supported)×××
MySQL versionAll8.0+AllAllAll

Al elegir la función adecuada según su caso de uso y la versión de MySQL, puede operar con los datos de manera más eficiente y segura.

Rendimiento y precauciones

Al realizar reemplazos masivos de cadenas en MySQL, especialmente en tablas grandes o en producción, puede encontrarse con problemas inesperados o degradación del rendimiento. Aquí hay precauciones clave y consejos de rendimiento para llevar a cabo el trabajo de forma segura y eficiente.

1. Tener cuidado con actualizaciones masivas en conjuntos de datos grandes

Las sentencias UPDATE que usan REPLACE() o REGEXP_REPLACE() escanean y reescriben las filas objetivo. Con conjuntos de datos grandes, el tiempo de ejecución aumenta y la carga del servidor puede volverse significativa. En tablas con decenas de miles a millones de filas, otras consultas pueden ralentizarse y, en el peor de los casos, pueden producirse bloqueos o tiempos de espera.

2. Impacto en los índices

Si un UPDATE modifica valores en columnas indexadas (p. ej., email, código), los índices pueden necesitar ser reconstruidos. Esto puede afectar el rendimiento. Para evitar reescrituras innecesarias, es importante limitar los datos objetivo con una cláusula WHERE.

3. Utilizar transacciones y reversión

Para reescrituras extensas, usar una transacción permite revertir si ocurre un error o si los resultados del reemplazo no son los esperados.

START TRANSACTION;
UPDATE users SET comment = REPLACE(comment, 'A', 'B') WHERE ...;
-- If everything looks good
COMMIT;
-- If something goes wrong
ROLLBACK;

Este enfoque le ayuda a trabajar con mayor confianza.

4. Siempre haga una copia de seguridad en producción

Antes de ejecutar actualizaciones masivas por lotes, siempre realice una copia de seguridad primero. Si ocurre una corrupción inesperada o pérdida de datos, puede restaurar desde la copia de seguridad.

5. El procesamiento por lotes o la ejecución dividida pueden ayudar

Si el número de filas es extremadamente grande, en lugar de actualizar todo de una vez, considere dividir el trabajo en fragmentos (p. ej., por rangos de ID) o ejecutarlo durante horas de baja demanda para reducir la carga del servidor.

UPDATE logs
SET message = REPLACE(message, 'error', 'info')
WHERE id BETWEEN 1 AND 10000;

La ejecución paso a paso ayuda a distribuir la carga del servidor.

Al considerar el rendimiento y la seguridad, puede lograr tanto eficiencia operativa como prevención de problemas al realizar reemplazos de cadenas.

Estudio de caso: ejemplos de uso en el mundo real

A continuación se presentan dos ejemplos prácticos de “reemplazo de cadenas” útiles en operaciones reales. Ambos ocurren con frecuencia durante el mantenimiento rutinario y la gestión de datos. Explicaremos el flujo de trabajo y las precauciones junto con consultas reales.

Caso 1: Actualización masiva de URLs en descripciones de productos

Este caso involucra un sitio de comercio electrónico donde, después de una renovación del sitio, se desea reemplazar la URL antigua (old-shop.com) por la nueva URL (new-shop.jp) en todas las descripciones de productos.

Pasos de ejemplo:

  1. Hacer una copia de seguridad de la tabla products antes de comenzar
  2. Limitar las filas objetivo usando una cláusula WHERE (se recomiendan ejecuciones de prueba)
  3. Ejecutar la sentencia UPDATE para la corrección masiva

Ejemplo real de SQL:

UPDATE products
SET description = REPLACE(description, 'old-shop.com', 'new-shop.jp');

Precauciones:

  • Siempre haga una copia de seguridad y valide exhaustivamente en un entorno de pruebas antes de aplicar los cambios a producción
  • Si pueden haber espacios o saltos de línea alrededor de la URL, considere también la sustitución mediante expresiones regulares (REGEXP_REPLACE) como alternativa

Caso 2: Estandarización de formatos de datos de clientes

La sustitución de cadenas también es útil para estandarizar formatos como números de teléfono y códigos postales en bases de datos de clientes. Por ejemplo, para eliminar los guiones de todos los números de teléfono y convertirlos en dígitos continuos:

Ejemplo real de SQL:

UPDATE customers
SET tel = REPLACE(tel, '-', '');

Si está usando MySQL 8.0 o superior, también puede usar expresiones regulares para correcciones de formato más flexibles.

Ejemplo de expresión regular (Estandarizar códigos postales a “123-4567”):

UPDATE customers
SET zipcode = REGEXP_REPLACE(zipcode, '([0-9]{3})-?([0-9]{4})', '\1-\2');

Precauciones:

  • Valide que los resultados sean los esperados antes de aplicar los cambios a los datos de producción
  • Si el impacto es grande, reduzca el alcance de la actualización paso a paso usando una cláusula WHERE

Como se muestra en estos estudios de caso, la sustitución de cadenas en MySQL es muy útil para el mantenimiento a gran escala y la limpieza rutinaria de datos. Al hacer copias de seguridad y validar de forma constante antes, puede prevenir errores y problemas.

Resumen y lista de verificación de trabajo

Hasta ahora, hemos cubierto cómo reemplazar cadenas en MySQL, desde conceptos básicos hasta técnicas avanzadas y ejemplos del mundo real. Finalmente, resumamos los puntos clave y proporcionemos una lista de verificación útil al realizar operaciones reales.

Conclusiones clave

  • REPLACE() es la mejor opción para sustituciones simples masivas de cadenas. Es sensible a mayúsculas y minúsculas y solo funciona con coincidencias exactas.
  • REGEXP_REPLACE() (MySQL 8.0+) permite la sustitución avanzada de patrones mediante expresiones regulares.
  • La sustitución masiva con UPDATE es conveniente, pero las copias de seguridad y la validación en un entorno de pruebas son esenciales.
  • Anidar REPLACE() es eficaz para reemplazar varios patrones a la vez.
  • Preste mucha atención al rendimiento, al impacto en los índices y a la carga del servidor al procesar grandes conjuntos de datos.

Lista de verificación de trabajo

  • □ ¿Ha identificado con precisión el patrón a reemplazar y la(s) columna(s) objetivo?
  • □ ¿Ha limitado las actualizaciones solo a las filas necesarias usando una cláusula WHERE?
  • □ ¿Ha realizado una copia de seguridad antes de aplicar los cambios a producción?
  • □ ¿Ha validado el comportamiento de la consulta usando un entorno de pruebas o datos ficticios?
  • □ ¿Tiene un plan para usar procesamiento por lotes o rangos LIMIT/ID según el volumen de datos y la carga del servidor?
  • □ Después de la operación, ¿ha verificado exhaustivamente que los resultados de la sustitución coincidan con lo esperado?
  • □ ¿Ha elegido la función adecuada según su versión de MySQL?

Al seguir esta lista de verificación, puede realizar la sustitución de cadenas en MySQL de forma segura y fiable.
Porque incluso un pequeño error puede provocar problemas graves, asegúrese de verificar cada paso cuidadosamente antes de aplicar los cambios a producción.

Preguntas frecuentes (FAQ)

Aquí resumimos preguntas comunes y preocupaciones del mundo real sobre la “sustitución de cadenas en MySQL”. Use esta sección para reducir la incertidumbre y trabajar con mayor confianza.

Q1. ¿REPLACE() distingue entre mayúsculas y minúsculas?

A1: Sí. REPLACE() distingue entre mayúsculas y minúsculas. Por ejemplo, “mysql” y “MySQL” se tratan como cadenas diferentes. Si necesita reemplazar ambas, puede anidar REPLACE() dos veces o usar otro método.

Q2. ¿Qué ocurre si lo utilizo en una columna que contiene NULL?

A2: Si la columna objetivo es NULL, el resultado de REPLACE() también será NULL y no se producirá ningún cambio. Si desea reemplazar incluso cuando existen valores NULL, combínelo con IFNULL().

Q3. ¿Puedo reemplazar varios patrones a la vez?

A3: Sí. Puede anidar llamadas a REPLACE() para reemplazar varios patrones en una sola instrucción. Sin embargo, los resultados pueden variar según el orden de sustitución, por lo que es necesario validar con antelación.

Q4. ¿Cómo puedo reemplazar usando expresiones regulares?

A4: Utilice REGEXP_REPLACE(), que está disponible en MySQL 8.0 y versiones posteriores. Si está usando una versión anterior, considere la sustitución a nivel de aplicación u otro método.

Q5. ¿Cuál es la diferencia con REPLACE INTO?

A5: REPLACE() es una función de “reemplazo de cadenas”, mientras que REPLACE INTO es una sentencia SQL similar a INSERT que “elimina una fila existente e inserta una nueva fila”. Cumplen propósitos completamente diferentes.

Q6. ¿Puedo restaurar los datos originales después del reemplazo? (Recuperación)

A6: En la mayoría de los casos, es difícil revertir los datos después de un reemplazo. Siempre haga una copia de seguridad antes de ejecutar la operación. Si algo sale mal, restaure desde su copia de seguridad.

Q7. ¿Cómo puedo comprobar mi versión de MySQL?

A7: Ejecute la siguiente consulta para comprobar su versión de MySQL:

SELECT VERSION();

Verifique su versión con anticipación para confirmar si funciones como REGEXP_REPLACE() están disponibles.

Use estas preguntas frecuentes para proceder con operaciones de reemplazo de cadenas con confianza.

Enlaces y referencias relacionadas

Si desea profundizar en el reemplazo de cadenas o en el aprendizaje de SQL, utilizar la documentación oficial y recursos técnicos confiables es eficaz. También presentamos artículos relacionados y herramientas útiles; por favor, úselos como referencia.

1. Documentación oficial de MySQL

2. Ejemplos prácticos de REGEXP_REPLACE()

4. Si desea aprender los conceptos básicos de SQL