Mysql
 sql >> Base de données >  >> RDS >> Mysql

mauvais filtre de mot écrit natif dans MYSQL sans php

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 .