Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

filtro de palavras ruins escrito nativo em MYSQL sem php


Estou postando como uma nova resposta, já que estou usando uma técnica diferente aqui. Estou pensando que podemos usar apenas uma função MySQL e um gatilho BEFORE INSERT. A função para dividir uma string é obtida desta outra resposta .
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

e o gatilho INSERT ficaria assim:
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

isso será mais rápido, pois a frase será convertida apenas uma vez, ao inseri-la no banco de dados. Ainda há algumas melhorias que precisamos, como antes:
LEFT JOIN words w ON s.split = w.bad

não corresponderá a palavras que contenham separador , . ! ? e a função de substituição
REPLACE(split, COALESCE(bad, ''), good)

fará distinção entre maiúsculas e minúsculas. Pode ser corrigido facilmente se desejar. Veja um violino aqui .