博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL 全角转换为半角
阅读量:6305 次
发布时间:2019-06-22

本文共 3236 字,大约阅读时间需要 10 分钟。

序言:
       用户注冊时候,录入了全角手机号码,所以导致短信系统依据手机字段发送短信失败。如今问题来了,怎样把全角手机号码变成半角手机号码?



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 ;



----------------------------------------------------------------------------------------------------------------

<版权所有,同意转载,但必须以链接方式注明源地址。否则追究法律责任!>

原博客地址:   

原作者:黄杉 (mchdba)

----------------------------------------------------------------------------------------------------------------


你可能感兴趣的文章
订单的子单表格设置颜色
查看>>
Office365 Exchange Hybrid 番外篇 ADFS后端SQL群集(一)
查看>>
9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路...
查看>>
lvs fullnat部署手册(三)rs内核加载toa篇
查看>>
C++策略模式
查看>>
我的友情链接
查看>>
oracle表分区详解
查看>>
网络编程中常见结构体
查看>>
SSL/TLS原理详解
查看>>
Docker 自定义SSH服务镜像
查看>>
JavaScript强化教程 —— Cocos2d-JS自动JSB绑定规则修改
查看>>
configure: error: in `/root/httpd-2.2.11/srclib/apr': c
查看>>
CentOS7搭建Kubernetes-dashboard管理服务
查看>>
buildroot下查找外部编译器通过ext-toolchain-wrapper调用的参数
查看>>
MySQL Replication 主主配置详细说明
查看>>
Linux的任务调度
查看>>
在Android studio中添加jar包方法如下
查看>>
iframe 在ie下面总是弹出新窗口解决方法
查看>>
分享10款漂亮实用的CSS3按钮
查看>>
安装nginx 常见错误及 解决方法
查看>>