Je le poste comme une nouvelle réponse, puisque j'utilise une technique différente ici. Je pense que nous pouvons simplement utiliser une fonction MySQL et un déclencheur BEFORE INSERT. La fonction pour diviser une chaîne est tirée de cette autre réponse .
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
et le déclencheur INSERT ressemblerait à ceci :
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
ce sera plus rapide, puisque la phrase ne sera convertie qu'une seule fois, lorsque vous l'insérerez dans la base de données. Il y a encore quelques améliorations dont nous avons besoin, comme avant :
LEFT JOIN words w ON s.split = w.bad
il ne correspondra pas aux mots contenant le séparateur , . ! ? et la fonction de remplacement
REPLACE(split, COALESCE(bad, ''), good)
sera sensible à la casse. Il peut être réparé assez facilement si vous le souhaitez. Veuillez consulter un violon ici .