INSERT (función de cadena)
La función INSERT reemplaza una porción de una cadena por otro texto, indicando la posición donde empieza el reemplazo y cuántos caracteres se sustituyen. Es una función poco conocida pero muy útil cuando necesitas modificar una parte concreta de un texto situada en una posición fija, sin buscar ningún patrón.
Lo primero es evitar una confusión muy habitual: la función de cadena INSERT no tiene nada que ver con la sentencia INSERT INTO que añade filas a una tabla. Son dos cosas completamente distintas que comparten nombre. La función que vemos aquí trabaja sobre texto y se diferencia de REPLACE en que opera por posición en lugar de por contenido. En este artículo veremos su sintaxis de cuatro argumentos, cómo insertar sin borrar, cómo enmascarar datos y su comparación con REPLACE.
Sintaxis
INSERT recibe cuatro argumentos: la cadena original, la posición de inicio, cuántos caracteres reemplazar y el texto nuevo que se coloca en su lugar.
INSERT(cadena, posicion, longitud, nueva_cadena)El significado de cada argumento es:
posicion: posición donde empieza el reemplazo, contando desde 1longitud: número de caracteres que se eliminan a partir de esa posiciónnueva_cadena: texto que se inserta en el hueco
Ejemplo básico
En su uso normal, sustituye un tramo de la cadena por otro texto. Aquí se reemplazan los cinco caracteres de mundo, que empiezan en la posición 6, por MySQL:
SELECT INSERT('Hola mundo', 6, 5, 'MySQL') AS resultado;| resultado |
|---|
| Hola MySQL |
Insertar sin eliminar
Un truco práctico es usar una longitud de 0. En ese caso INSERT no borra nada y se limita a intercalar el nuevo texto en la posición indicada, lo que permite, por ejemplo, meter un espacio en medio de una palabra:
SELECT INSERT('HolaMundo', 5, 0, ' ') AS resultado;| resultado |
|---|
| Hola Mundo |
Reemplazar con texto de distinta longitud
El texto nuevo no tiene por qué medir lo mismo que el tramo eliminado. Aquí se sustituyen los cuatro caracteres del año por otro año, también de cuatro cifras, para corregir una fecha:
SELECT INSERT('2024-01-15', 1, 4, '2025') AS resultado;| resultado |
|---|
| 2025-01-15 |
Y aquí se reemplazan tres dígitos de un teléfono por asteriscos, manteniendo el resto intacto:
SELECT INSERT('Tel: 612345678', 6, 3, '***') AS resultado;| resultado |
|---|
| Tel: ***345678 |
Ocultar parte de un dato
Donde INSERT resulta más cómodo que REPLACE es al enmascarar un tramo fijo de un dato, porque actúa sobre una posición exacta en lugar de buscar un texto concreto. Así se ocultan cuatro dígitos centrales de cada teléfono:
SELECT
nombre,
INSERT(telefono, 4, 4, '****') AS telefono_oculto
FROM clientes
LIMIT 5;| nombre | telefono_oculto |
|---|---|
| María | 612****678 |
| Carlos | 623****789 |
| Laura | 634****890 |
| Pedro | 645****901 |
| Ana | 656****012 |
Casos límite: posición fuera de rango y NULL
Conviene saber cómo reacciona INSERT ante valores inesperados. Si la posición de inicio es mayor que la longitud de la cadena, no hay nada que reemplazar y devuelve la cadena original sin tocarla:
SELECT INSERT('Hola', 100, 5, 'mundo') AS resultado;| resultado |
|---|
| Hola |
Y, como el resto de funciones de cadena, propaga el valor NULL: si la cadena de entrada es nula, el resultado también lo es:
SELECT INSERT(NULL, 1, 5, 'texto') AS resultado;| resultado |
|---|
| NULL |
INSERT frente a REPLACE
Ambas funciones modifican texto, pero parten de criterios opuestos. La siguiente tabla aclara cuándo conviene cada una:
| Característica | INSERT | REPLACE |
|---|---|---|
| Opera por | Posición | Contenido |
| Reemplaza | N caracteres desde la posición X | Todas las apariciones del texto |
| Uso ideal | Modificar un tramo en posición fija | Buscar y sustituir un texto |
En resumen: usa INSERT cuando sabes exactamente en qué posición está lo que quieres cambiar, y REPLACE cuando quieres sustituir un texto allá donde aparezca.
Errores comunes
El error más frecuente es confundir esta función con la sentencia INSERT INTO, sobre todo al buscar documentación. Si tu intención es añadir filas, esa es otra sentencia distinta; la función INSERT solo manipula cadenas.
El segundo descuido tiene que ver con la indexación basada en 1 y con calcular mal la longitud a reemplazar. Como la posición fija no se adapta al contenido, INSERT es frágil cuando los datos no tienen una estructura constante: enmascarar "los dígitos centrales" funciona bien si todos los teléfonos tienen la misma longitud, pero falla si varían. En esos casos conviene calcular las posiciones dinámicamente con LOCATE o INSTR.
Cuándo usar INSERT
INSERT es la opción adecuada cuando necesitas reemplazar o intercalar texto en una posición fija y conocida de la cadena, como corregir un tramo de una fecha o enmascarar dígitos en datos de formato uniforme. Si la modificación depende del contenido y no de la posición, REPLACE es lo correcto; y si solo quieres extraer una porción sin modificar nada, recurre a SUBSTRING.
En el siguiente artículo veremos INSTR, que encuentra la posición de un texto dentro de una cadena.
Escrito por Eduardo Lázaro
