sql >> Base de Datos >  >> RDS >> Mysql

filtro de malas palabras escrito nativo en MYSQL sin php

Lo estoy publicando como una nueva respuesta, ya que estoy usando una técnica diferente aquí. Estoy pensando que podemos usar una función MySQL y un activador ANTES DE INSERTAR. La función para dividir una cadena se toma de esta otra respuesta .

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

y el activador INSERTAR sería así:

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

esto será más rápido, ya que la oración se convertirá solo una vez, cuando la inserte en la base de datos. Todavía hay algunas mejoras que necesitamos, igual que antes:

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

no coincidirá con palabras que contengan separador , . ! ? y la función de reemplazo

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

distinguirá entre mayúsculas y minúsculas. Se puede arreglar qute fácilmente si lo desea. Consulte un violín aquí .