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 1
  • longitud: número de caracteres que se eliminan a partir de esa posición
  • nueva_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;
nombretelefono_oculto
María612****678
Carlos623****789
Laura634****890
Pedro645****901
Ana656****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ísticaINSERTREPLACE
Opera porPosiciónContenido
ReemplazaN caracteres desde la posición XTodas las apariciones del texto
Uso idealModificar un tramo en posición fijaBuscar 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