Tôi đăng nó như một câu trả lời mới, vì tôi đang sử dụng một kỹ thuật khác ở đây. Tôi nghĩ chúng ta chỉ có thể sử dụng một hàm MySQL và một kích hoạt CHÈN TRƯỚC. Hàm tách chuỗi được lấy từ câu trả lời khác này .
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
và trình kích hoạt INSERT sẽ giống như sau:
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
điều này sẽ nhanh hơn, vì câu sẽ chỉ được chuyển đổi một lần, khi bạn chèn nó vào cơ sở dữ liệu. Vẫn có một số cải tiến mà chúng tôi cần, giống như trước đây:
LEFT JOIN words w ON s.split = w.bad
nó sẽ không khớp với các từ chứa dấu phân cách,. ! ? và chức năng thay thế
REPLACE(split, COALESCE(bad, ''), good)
sẽ phân biệt chữ hoa chữ thường. Nó có thể được cố định qute một cách dễ dàng nếu bạn muốn. Vui lòng xem fiddle tại đây .