开发者社区> 技术mix呢> 正文

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 ;


----------------------------------------------------------------------------------------------------------------
<版权所有,同意转载,但必须以链接方式注明源地址。否则追究法律责任!>
原博客地址:   http://blog.itpub.net/26230597/viewspace-1316445/
原作者:黄杉 (mchdba)
----------------------------------------------------------------------------------------------------------------







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5078713.html,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
mysql 日期 时间戳 转换
/***************************************************************************************** * mysql 日期 时间戳 转换 * 说明: * 要通过Python获取数据库中的时间信息,发现需要另外进行转换才行.
700 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
14303 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
29732 0
【Python】转换mysql 结果集为词典类型
Python的MySQLdb模块是Python连接MySQL的一个模块, 使用MySQLdb 模块获取mysql中的记录,默认查询结果返回是tuple类型,只能通过0,1等索引下标访问数据。
642 0
关于MYSQL的行列转换
同事今天中午去参加一个面试,有一道面试题比较基础 把 a        b        c 1        1        1.1 1        2        1.2 1        3        1.3 2        1        2.1 2        2        2.2 2        3        2.3 变成
906 0
mysql将字符转换成数字
在操作mysql时,经常需要将字符转换成数字,这一步虽然简单,但不常用的话也很容易忘记,现将在网上找到的方法记录如下: 1.将字符的数字转成数字,比如'0'转成0可以直接用加法来实现例如:将pony表中的d 进行排序,可d的定义为varchar,可以这样解决select * from pony order by (d+0)2.
709 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20985 0
+关注
2968
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载