sql >> Database >  >> RDS >> Mysql

slecht woord filter native geschreven in MYSQL zonder php

Ik post het als een nieuw antwoord, omdat ik hier een andere techniek gebruik. Ik denk dat we gewoon een MySQL-functie en een BEFORE INSERT-trigger kunnen gebruiken. De functie om een ​​string te splitsen is van dit andere antwoord overgenomen .

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

en de INSERT-trigger zou als volgt zijn:

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

dit gaat sneller, omdat de zin slechts één keer wordt geconverteerd, wanneer u deze in de database invoegt. Toch zijn er enkele verbeteringen die we nodig hebben, hetzelfde als voorheen:

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

het komt niet overeen met woorden die het scheidingsteken , . ! ? en de vervangfunctie

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

hoofdlettergevoelig zal zijn. Het kan desgewenst eenvoudig worden gerepareerd. Zie een viool hier .



  1. SQL-query werkt in phpmyadmin maar niet in php

  2. MySQL-problemen - Hiragana en Katakana worden als hetzelfde behandeld

  3. Wat is de eenvoudigste manier om een ​​lokale variabele in Oracle te definiëren?

  4. Hoe u het verschil tussen twee datums kunt afronden naar uren