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))[email protected])) 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)
----------------------------------------------------------------------------------------------------------------

时间: 2024-12-29 01:03:17

MySQL 全角转换为半角的相关文章

设置用户密码时,将全角转换为半角

情景: 注册管理员账号,用户输入的是全角密码,登录时输入半角密码,显示密码错误 解决方案: 将全角密码改成半角密码 var password = self.loginForm.password // 将全角密码转换为半角 var result=""; for (var i = 0; i < password.length; i++){ if (password.charCodeAt(i)==12288){ // 全角空格 result+= String.fromCharCode(

js对全角与半角的验证,相互转化以及介绍

1.什么是全角和半角? 全角:是一种电脑字符,是指一个全角字符占用两个标准字符(或两个半角字符)的位置.全角占两个字节. 汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都是全角字符.在全角中,字母和数字等与汉字一样占据着等宽的位置. 半角:是指一个字符占用一个标准的字符位置.半角占一个字节. 半角就是 ASCII 方式的字符,在没有汉字输入法起作用的时候,输入的字母.数字和字符都是半角的. 每个半角字符只占用一字节的空间(一字节有8位,共256个编码空间).汉语.日

JS如何判断文字是全角还是半角(转载)

转载自:http://www.php.cn/js-tutorial-362638.html 全角:是一种电脑字符,是指一个全角字符占用两个标准字符(或两个半角字符)的位置.全角占两个字节.半角:是指一个字符占用一个标准的字符位置.半角占一个字节.接下来通过本文给大家介绍JS验证全角与半角及相互转化的知识,需要的朋友参考下吧 1.什么是全角和半角? 全角:是一种电脑字符,是指一个全角字符占用两个标准字符(或两个半角字符)的位置.全角占两个字节. 汉字字符和规定了全角的英文字符及国标GB2312-8

js 全角与半角互转

///全角空格为12288,半角空格为32    ///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248    //半角转换为全角函数    function ToDBC(txtstring) {        var tmp = "";        for (var i = 0; i < txtstring.length; i++) {            if (txtstring.charCodeAt(i) == 32) {  

word中利用宏替换标点标点全角与半角

Alt+F11,然后插入-模块: 复制下面代码到编辑窗口: Sub 半角标点符号转换为全角标点符号() '中英互译文档中将中文段落中的英文标点符号替换为中文标点符号 Dim i As Paragraph, ChineseInterpunction() As Variant, EnglishInterpunction() As Variant Dim MyRange As Range, N As Byte '定义一个中文标点的数组对象 ChineseInterpunction = Array(".

详解全角和半角的转换

最近在项目中遇到一个问题,客户上传的文件无法下载下来,经过定位发现原来客户上传的文件名中包含很多全角字符导致无法解析,找不到对应的文件,其实文件是真实存在的,只是用的上传下载组件不支持全角字符的文件名,从而导致文件找到不到,无法下载. 所以本人就对全角和半角进行了一些分析和总结以及它们之间用java代码是如何进行转换的经验同各位园友进行分享,希望大家共同学习,共同进步,不足之处,请大家不吝指出. 好了,进入正题......... 全角和半角简介 全角是一种电脑字符,且每个全角字符占用两个标准字符

SQL转换全角和半角函数

SQL转换全角和半角函数 CREATE FUNCTION f_Convert( @str NVARCHAR(4000), --要转换的字符串 @flag bit --转换标志,0转换成半角,1转换成全角 )RETURNS nvarchar(4000) AS BEGIN DECLARE @pat nvarchar(8),@step int,@i int,@spc int IF @flag=0 SELECT @pat=N'%[!--]%',@step=-65248, @str=REPLACE(@st

C#全角和半角转换

在计算机屏幕上,一个汉字要占两个英文字符的位置,人们把一个英文字符所占的位置称为"半角",相对地把一个汉字所占的位置称为"全角".在汉字输入时,系统提供"半角"和"全角"两种不同的输入状态,但是对于英文字母.符号和数字这些通用字符就不同于汉字,在半角状态它们被作为英文字符处理:而在全角状态,它们又可作为中文字符处理.半角和全角切换方法:单击输入法工具条上的 按钮或按键盘上的Shift+Space键来切换. (1)全角--指一个

全角转半角-半角转全角

package com.sogou.html; public class FullHalfReverse { /** * 半角转全角 */ public static String ToSBC(String input) { char[] c = input.toCharArray(); int length=c.length; for (int i = 0; i < length; i++) { if (c[i] == ' ') { c[i] = '\u3000'; } else if (c[