2009-11-25 61 views
3

您是否知道在Mysql中從varchar變量中刪除(或替換)所有非字母數字字符的簡便方法?刪除MySQL中的非alpha數字字符

像字符串的的replaceAll( 「[^ A-ZA-Z0-9]」, 「I」)在Java中( '我' 是我的特殊字符 「」 是也不錯)

+0

在將字符串傳遞給mysql之前用'「」替換'\ W' – Amarghosh 2009-11-25 13:03:36

+0

這些字符串已經在db :(...並且其中有無數... – 2009-11-25 13:22:18

回答

1

看樣子根據RegexBuddy的文檔,MySQL不提供此功能(與PostgreSQL不同):

MySQL對正則表達式的支持相當有限,但仍然非常有用。 MySQL只有一個運算符,它允許你使用正則表達式。這是REGEXP運算符,其工作方式與LIKE運算符相似,不同之處在於它不使用_和%通配符,而是使用POSIX擴展正則表達式(ERE)。

0

我要使用事端這樣對於每個字串(我替換每個壞字符與「O」):

CREATE FUNCTION removeNonAlphaNum (p_zthes VARCHAR(255)) RETURNS VARCHAR(255) 
BEGIN 
DECLARE v_i INTEGER; 
DECLARE v_char VARCHAR(1); 
DECLARE v_res VARCHAR(255); 
SET v_i := LENGTH(p_zthes); 
SET v_res:=p_zthes; 
WHILE v_i > 0 DO 
    SET v_char := SUBSTRING(p_zthes, v_i, 1); 
    IF (SELECT v_char REGEXP '[^a-zA-Z0-9]') THEN 
     SET v_res := REPLACE(v_res, v_char, 'O'); 
    END IF; 
    SET v_i := v_i - 1; 
    END WHILE; 
return v_res; 
END 

但我想我會避免這樣的怪物(遍歷字符的字符串,並檢查每個反對正則表達式... bleeeeee ...): - /我仍然需要測試它。

還有沒有更多的性感解決方案?

0

這是sql server中的解決方案。但是這個概念就像我創建了一個數字表並分解了這些數據表,然後將這些數據與正則表達式進行匹配。

希望同樣的概念可以在mysql中描述一下,希望你能做到。

declare @str varchar(50) 
    set @str = '1ab3^45)(*%' 

    declare @NumberTable table(id int) 
    insert into @NumberTable(id) values(1) 
    insert into @NumberTable(id) values(2) 
    insert into @NumberTable(id) values(3) 
    insert into @NumberTable(id) values(4) 
    insert into @NumberTable(id) values(5) 
    insert into @NumberTable(id) values(6) 
    insert into @NumberTable(id) values(7) 
    insert into @NumberTable(id) values(8) 
    insert into @NumberTable(id) values(9) 
    insert into @NumberTable(id) values(10) 
    insert into @NumberTable(id) values(11) 
    insert into @NumberTable(id) values(12) 

    select NonAlphaChars = SUBSTRING(@str,id,1) from @NumberTable 
    where SUBSTRING(@str,id,1) like '%[^a-z0-9]' 

NonAlphaChars

^ 
) 
(
* 
% 
+0

嗯,它是以某種方式更好(更快),然後遍歷一個字符串? – 2009-12-01 13:52:15

0

對於MSSQL我犯了這樣的事情:

CREATE FUNCTION removeNonAlphaNum(@p_zthes VARCHAR(255)) 
RETURNS varchar(255) 
AS 
BEGIN 
DECLARE @v_bad_char_index INT; 
DECLARE @v_bad_char VARCHAR(1); 
DECLARE @v_res VARCHAR(255); 
SET @v_res = @p_zthes; 
SET @v_bad_char_index = patindex('%[^a-zA-Z0-9]%', @p_zthes) 
WHILE (@v_bad_char_index > 0) 
    BEGIN 
    SET @v_bad_char = SUBSTRING(@p_zthes, @v_bad_char_index, 1); 
    SET @v_res = REPLACE(@v_res, @v_bad_char, 'O'); 
    SET @v_bad_char_index = patindex('%[^a-zA-Z0-9]%', @v_res) 
    END 
return @v_res; 
END 

(但我SQL程序員差,所以有可能存在一些更好的解決方案)