本章MySQL教程,UncleToo给大家介绍一个MySQL的自定义函数,使用它我们可以很方便的清理数据表中的特殊字符或非ASCII字符。同时还可以通过参数来去除指定内容,如是否去掉字母,是否去掉数字,是否去掉空格、制表符等等。
函数用法:
stripSpeciaChars ( string , allow_space , allow_number , allow_alphabets , no_trim ) ;
各参数含义:
string:要清理的字符串/字段
allow_space:是否去除空格,默认值0,
allow_number:是否去除数字,默认值0,
allow_alphabets:是否去除字母,默认值1,
no_trim:是否去除空格、制表符,默认值1。
用法示例:
1、删除数字
SELECT stripSpeciaChars("Uncle520*&Too",0,0,1,0);
结果:UncleToo
2、删除字母
SELECT stripSpeciaChars("Uncle520*&Too",0,1,0,0);
结果:520
3、删除数字,不删除空格
SELECT stripSpeciaChars("Uncle5ÒÓÔÕÖØÙÚàáâã 20*&TÄÅÆÇÈÉÊoo",1,0,1,1);
结果:Uncle Too
这个函数很功能很强大吧,下面是函数的代码,大家只要在数据库中执行一下就可以了:
DROP FUNCTION IF EXISTS `stripSpeciaChars`;
DELIMITER ;;
CREATE FUNCTION `stripSpeciaChars`(`dirty_string` varchar(2048),allow_space TINYINT,allow_number TINYINT,allow_alphabets TINYINT,no_trim TINYINT) RETURNS varchar(2048) CHARSET utf8
BEGIN
/**
* MySQL function to remove Special characters, Non-ASCII,hidden characters leads to spaces, accents etc
* Downloaded from http://www.uncletoo.com
*/
DECLARE clean_string VARCHAR(2048) DEFAULT '';
DECLARE c VARCHAR(2048) DEFAULT '';
DECLARE counter INT DEFAULT 1;
DECLARE has_space TINYINT DEFAULT 0; -- let spaces in result string
DECLARE chk_cse TINYINT DEFAULT 0;
DECLARE adv_trim TINYINT DEFAULT 1; -- trim extra spaces along with hidden characters, new line characters etc.
if allow_number=0 and allow_alphabets=0 then
RETURN NULL;
elseif allow_number=1 and allow_alphabets=0 then
set chk_cse =1;
elseif allow_number=0 and allow_alphabets=1 then
set chk_cse =2;
end if;
if allow_space=1 then
set has_space =1;
end if;
if no_trim=1 then
set adv_trim =0;
end if;
IF ISNULL(dirty_string) THEN
RETURN NULL;
ELSE
CASE chk_cse
WHEN 1 THEN
-- return only Numbers in result
WHILE counter <= LENGTH(dirty_string) DO
SET c = MID(dirty_string, counter, 1);
IF ASCII(c) = 32 OR ASCII(c) >= 48 AND ASCII(c) <= 57 THEN
SET clean_string = CONCAT(clean_string, c);
END IF;
SET counter = counter + 1;
END WHILE;
WHEN 2 THEN
-- return only Alphabets in result
WHILE counter <= LENGTH(dirty_string) DO
SET c = MID(dirty_string, counter, 1);
IF ASCII(c) = 32 OR ASCII(c) >= 65 AND ASCII(c) <= 90 OR ASCII(c) >= 97 AND ASCII(c) <= 122 THEN
SET clean_string = CONCAT(clean_string, c);
END IF;
SET counter = counter + 1;
END WHILE;
ELSE
-- return numbers and Alphabets in result
WHILE counter <= LENGTH(dirty_string) DO
SET c = MID(dirty_string, counter, 1);
IF ASCII(c) = 32 OR ASCII(c) >= 48 AND ASCII(c) <= 57 OR ASCII(c) >= 65 AND ASCII(c) <= 90 OR ASCII(c) >= 97 AND ASCII(c) <= 122 THEN
SET clean_string = CONCAT(clean_string, c);
END IF;
SET counter = counter + 1;
END WHILE;
END CASE;
END IF;
-- remove spaces from result
if has_space=0 then
SET clean_string =REPLACE(clean_string,' ','');
end if;
-- remove extra spaces, newline,tabs. from result
if adv_trim=1 then
SET clean_string =TRIM(Replace(Replace(Replace(clean_string,'\t',''),'\n',''),'\r',''));
end if;
RETURN clean_string;
END
;;
DELIMITER ;