Публикувам го като нов отговор, тъй като използвам различна техника тук. Мисля, че можем просто да използваме MySQL функция и тригер BEFORE INSERT. Функцията за разделяне на низ е взета от този друг отговор .
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
и тригерът INSERT би бил така:
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
това ще бъде по-бързо, тъй като изречението ще бъде преобразувано само веднъж, когато го вмъкнете в базата данни. Все пак има някои подобрения, от които се нуждаем, както и преди:
LEFT JOIN words w ON s.split = w.bad
няма да съответства на думи, съдържащи разделител , . ! ? и функцията за замяна
REPLACE(split, COALESCE(bad, ''), good)
ще бъде чувствителен към главни и малки букви. Може да се поправи доста лесно, ако желаете. Моля, вижте цигулка тук .