sql >> データベース >  >> RDS >> Mysql

PHPなしでMYSQLでネイティブに書かれた悪い単語フィルター

    ここでは別の手法を使用しているため、新しい回答として投稿しています。 MySQL関数とBEFOREINSERTトリガーを使用できると思います。文字列を分割する関数は、この他の回答から取得されます 。

    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
    

    センテンスをデータベースに挿入すると、センテンスが1回だけ変換されるため、これはより高速になります。以前と同じように、まだいくつかの改善が必要です:

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

    区切り文字、を含む単語とは一致しません。 ! ?および置換機能

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

    大文字と小文字が区別されます。必要に応じて簡単に修正できます。 こちら のフィドルをご覧ください。 。



    1. mysqlデータベースから最も近い地理的な場所を選択する最も速い方法は何ですか?

    2. 行の削除:xレコードを超える単一メンバーはありません

    3. サブクエリの結果に正規表現を使用するにはどうすればよいですか?

    4. サポートされていないキーワード:メタデータ