天天看點

mysql5.7實作regex_replace正則替換功能

PS:最近接個小需求:針對使用者敏感資訊脫敏處理,資料源在mysql。剛開始想法是直接用mysql裡面的regexp_replace函數對敏感字段進行清洗。後來發現mysql8.0才支援regexp_replace()。mysql5.7裡隻有正則比對的函數。再後來想把資料抽取到hdfs上用hive來處理。一想到還得抽數建表,我最終決定用mysql的自定義函數來解決,省時省力。

1.開啟mysql自定義函數支援

a.檢視mysql目前是否支援編寫自定義:

mysql5.7實作regex_replace正則替換功能

b.log_bin_trust_function_creators=OFF表示沒有開啟自定義函數。輸入開啟指令。

mysql5.7實作regex_replace正則替換功能

注:此處不開啟,後面自定義函數寫好。調用不起作用!

2.編寫regexp_replace()自定義函數

a.編寫代碼如下:

#建立前删除已經建立的自定義函數
drop function if exists regexp_replace;
#建立 regexp_replace函數
DELIMITER $$  
CREATE FUNCTION  `regexp_replace`(string_a VARCHAR(1000),pattern VARCHAR(1000),string_b VARCHAR(1000))  
  RETURNS VARCHAR(1000)  
  DETERMINISTIC  
BEGIN  
 DECLARE string_c VARCHAR(1000);  
 DECLARE nub VARCHAR(1);  
 DECLARE i INT;  
 SET i =1;  
 SET string_c ='';  
 IF string_a REGEXP pattern THEN  
    loop_label: LOOP  
      IF i>CHAR_LENGTH(string_a) THEN  
        LEAVE loop_label;  
 END IF;
 SET nub = SUBSTRING(string_a,i,1);  
 IF NOT nub REGEXP pattern THEN  
 SET string_c = CONCAT(string_c,nub);  
      ELSE  
        SET string_c = CONCAT(string_c,string_b);  
      END IF;  
      SET i=i+1;  
    END LOOP;  
  ELSE
    SET string_c = string_a;  
  END IF;  
  RETURN string_c;  
END$$  
DELIMITER; 
           

b.上述代碼執行後,檢查下是否建立成功。結果已經建立成功。

mysql5.7實作regex_replace正則替換功能

c.對該函數進行測試,結果成功!

mysql5.7實作regex_replace正則替換功能

繼續閱讀