Lo estoy publicando como una nueva respuesta, ya que estoy usando una técnica diferente aquí. Estoy pensando que podemos usar una función MySQL y un activador ANTES DE INSERTAR. La función para dividir una cadena se toma de esta otra respuesta .
CREATE FUNCTION strSplit(x VARCHAR(1000), delim VARCHAR(12), pos INTEGER)
RETURNS VARCHAR(1000)
BEGIN
DECLARE output VARCHAR(1000);
SET output = REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos)
, CHAR_LENGTH(SUBSTRING_INDEX(x, delim, pos - 1)) + 1)
, delim
, '');
IF output = '' THEN SET output = null; END IF;
RETURN output;
END
y el activador INSERTAR sería así:
CREATE TRIGGER change_words
BEFORE INSERT ON sentences
FOR EACH ROW
BEGIN
DECLARE i INT;
DECLARE s VARCHAR(1000);
DECLARE r VARCHAR(1000);
SET i = 1;
SET s = '';
REPEAT
SET s = (
SELECT
REPLACE(split, COALESCE(bad, ''), good)
FROM
(SELECT strSplit(new.sentence, ' ', i) AS split) s
LEFT JOIN words w ON s.split = w.bad
LIMIT 1
);
SET r = CONCAT_WS(' ', r, s);
SET i = i + 1;
UNTIL s IS NULL
END REPEAT;
SET new.sentence = r;
END
esto será más rápido, ya que la oración se convertirá solo una vez, cuando la inserte en la base de datos. Todavía hay algunas mejoras que necesitamos, igual que antes:
LEFT JOIN words w ON s.split = w.bad
no coincidirá con palabras que contengan separador , . ! ? y la función de reemplazo
REPLACE(split, COALESCE(bad, ''), good)
distinguirá entre mayúsculas y minúsculas. Se puede arreglar qute fácilmente si lo desea. Consulte un violín aquí .