Mysql
 sql >> база данни >  >> RDS >> Mysql

филтър за лоши думи, написан в MYSQL без php

Публикувам го като нов отговор, тъй като използвам различна техника тук. Мисля, че можем просто да използваме MySQL функция и тригер BEFORE INSERT. Функцията за разделяне на низ е взета от този друг отговор .

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

и тригерът INSERT би бил така:

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

това ще бъде по-бързо, тъй като изречението ще бъде преобразувано само веднъж, когато го вмъкнете в базата данни. Все пак има някои подобрения, от които се нуждаем, както и преди:

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

няма да съответства на думи, съдържащи разделител , . ! ? и функцията за замяна

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

ще бъде чувствителен към главни и малки букви. Може да се поправи доста лесно, ако желаете. Моля, вижте цигулка тук .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изберете записи с дублиращи се само едно поле и всички други стойности на полета?

  2. Mysql изберете с условна логика

  3. Достъпът е отказан за потребител 'root'@'localhost' (използвайки парола:Да) след нулиране на паролата LINUX

  4. GTFS заявка за изброяване на всички часове на заминаване и пристигане между две имена на спирки

  5. Проверете дали конкретна mysql връзка вече съществува по време на php скрипт?