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

dårligt ordfilter skrevet indfødt i MYSQL uden php

Jeg poster det som et nyt svar, da jeg bruger en anden teknik her. Jeg tænker, at vi bare kan bruge en MySQL-funktion og en BEFORE INSERT-trigger. Funktionen til at opdele en streng er taget fra dette andet svar .

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

og INSERT-triggeren ville være sådan her:

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

dette vil være hurtigere, da sætningen kun bliver konverteret én gang, når du indsætter den i databasen. Der er stadig nogle forbedringer, som vi har brug for, samme som før:

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

det vil ikke matche ord, der indeholder separator, . ! ? og udskiftningsfunktionen

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

vil være forskel på store og små bogstaver. Det kan nemt rettes, hvis du ønsker det. Se venligst en violin her .



  1. Opdater række med data fra en anden række i samme tabel

  2. Udskrivning til skærm i .sql-fil postgres

  3. Forespørg en tabel og et kolonnenavn gemt i en tabel

  4. Udforskning af modul-API'erne i Java 9