天天看点

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正则替换功能

继续阅读