Mysql
 sql >> Database >  >> RDS >> Mysql

filtro parolacce scritto nativo in MySQL senza php

Lo sto pubblicando come una nuova risposta, poiché qui sto usando una tecnica diversa. Sto pensando che possiamo semplicemente usare una funzione MySQL e un trigger BEFORE INSERT. La funzione per dividere una stringa è presa da quest'altra risposta .

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 il trigger INSERT sarebbe così:

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

questo sarà più veloce, poiché la frase verrà convertita una sola volta, quando la inserirai nel database. Ci sono ancora alcuni miglioramenti di cui abbiamo bisogno, come prima:

LEFT JOIN words w ON s.split = w.bad

non corrisponderà a parole contenenti separatore , . ! ? e la funzione di sostituzione

REPLACE(split, COALESCE(bad, ''), good)

farà distinzione tra maiuscole e minuscole. Può essere risolto facilmente se lo desideri. Si prega di vedere un violino qui .