Mysql中全角半角问题

1,手机号码全角转换成半角
先查询出来全角半角都存在的手机号码的数据
SELECT a.username ,COUNT(1) AS num
FROM(
 SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(uu.user_name,'0','0'),'1','1'),'2','2'),'3','3'),'4','4') ,'5','5'),'6','6'),'7','7') ,'8','8'),'9','9') AS username
 FROM UC_USER uu WHERE uu.`USER_NAME` IS NOT NULL
)a GROUP BY a.username  HAVING (COUNT(1)>1)
;
得到如下重复记录:
("MB.134xx76802x" ,
"MB.136xx88105x" ,
"MB.152xx80801x" ,
"MB.157xx49518x" ,
"MB.186xx88282x" ,
"MB.189xx94855x" ); )




然后删除掉已经存在半角的全角手机号码记录,不然转换后会有重复的手机号码。
DELETE FROM `UC_USER` 
        WHERE MOBILE LIKE '%1%'
        AND REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(user_name,'0','0'),'1','1'),'2','2'),'3','3'),'4','4') ,'5','5'),'6','6'),'7','7') ,'8','8'),'9','9')
        IN("MB.134xx76802x" ,
"MB.136xx88105x" ,
"MB.152xx80801x" ,
"MB.157xx49518x" ,
"MB.186xx88282x" ,
"MB.189xx94855x" ); 




之后再修改全角手机号码为半角手机号码
 UPDATE UC_USER  uu 
            SET uu.`MOBILE`=REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(uu.`MOBILE`,'0','0'),'1','1'),'2','2'),'3','3'),'4','4') ,'5','5'),'6','6'),'7','7') ,'8','8'),'9','9'),
              uu.`USER_NAME`=REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(uu.user_name,'0','0'),'1','1'),'2','2'),'3','3'),'4','4') ,'5','5'),'6','6'),'7','7') ,'8','8'),'9','9')
            WHERE uu.`MOBILE` IS NOT NULL;




2,如何把所以的全角转换成半角
上面只是人为用比较笨拙的10个replace将全角转换成了半角,有没有一种通用的思路或者方法来实现呢?于是google了很多资料,写下如下的存储函数。
DELIMITER /$/$
USE  csdn /$/$
CREATE FUNCTION `csdn`.`func_convert`(p_str VARCHAR(200),flag INT)
 RETURNS VARCHAR(200)
BEGIN  
    DECLARE pat VARCHAR(8);
    DECLARE step INT ;
    DECLARE i INT ;
    DECLARE spc INT;
    DECLARE str VARCHAR(200);
    
    SET str=p_str;
    IF  flag=0 THEN  /**全角换算半角*/
      SET pat= N'%[!-~]%' ;
      SET step=  -65248  ; 
      SET str = REPLACE(str,N' ',N'  '); 
    ELSE  /**半角换算全角*/
      SET  pat= N'%[!-~]%' ;
      SET  step= 65248  ; 
      SET str= REPLACE(str,N'  ',N' ') ;  
    END IF; 
    
    SET i=LOCATE(pat,str) ;
    loop1:WHILE i>0  DO
 /**开始将全角转换成半角*/
      SET  str= REPLACE(str, SUBSTRING(str,i,1), CHAR(UNICODE(SUBSTRING(str,i,1))+step));
      SET  i=INSTR(str,pat)  ;
    END WHILE loop1;
    RETURN(str)  
END /$/$ 
DELIMITER ;


 


3,google出来的sqlserver中的全角半角转换函数。
DELIMITER /$/$
CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    FUNCTION `test`.`u_convert`(@str  NVARCHAR(4000),@flag  BIT )
RETURNS  NVARCHAR  
BEGIN  
    DECLARE    @pat NVARCHAR(8);
    DECLARE    @step  INTEGER;
    DECLARE    @i  INTEGER;
    DECLARE    @spc  INTEGER;        
    IF  @flag=0 
    BEGIN 
      SELECT  N'%[!-~]%' INTO @pat;
      SELECT  -65248  INTO  @step; 
      SELECT  REPLACE(@str,N' ',N'  ') INTO @str; 
    END
    ELSE  
    BEGIN
      SELECT  N'%[!-~]%' INTO @pat;
      SELECT  65248  INTO  @step; 
      SELECT  REPLACE(@str,N'  ',N' ') INTO @str;  
    END
    SELECT patindex(@pat  COLLATE LATIN1_GENERAL_BIN,@str) INTO @i;
    WHILE  @i>0  DO
      SELECT  REPLACE(@str,  SUBSTRING(@str,@i,1), NCHAR(UNICODE(SUBSTRING(@str,@i,1))+@step)) INTO @str;
      SELECT  patindex(@pat  COLLATE  LATIN1_GENERAL_BIN,@str) INTO @i;
    END WHILE
    RETURN(@str)  
END /$/$ 
DELIMITER ;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值