2012-12-26 56 views
3

我嘗試創建一個MySQL函數來將給定的字符串解析爲我可以在URL中使用的版本。所以我不得不消除一些特殊字符,並嘗試用循環來保持代碼簡單並且不必指定任何字符。用char替換MySQL函數

我當前的代碼是:

DECLARE parsedString VARCHAR(255); 

# convert to low chars 
SET parsedString = CONVERT(paramString USING latin1); 
SET parsedString = LOWER(parsedString); 

# replace chars with A 
SET @x = 223; 

charReplaceA: WHILE @x <= 229 DO 
    SET @x = @x + 1; 

    SET parsedString = REPLACE (parsedString, CHAR(@x USING ASCII), 'a'); 
END WHILE charReplaceA; 

# convert to utf8 and return 
RETURN CONVERT(parsedString USING utf8); 

如果我嘗試使用我的代碼,這是行不通的。不知何故,它不能識別CHAR(@x USING ASCII)部分。

SELECT urlParser('aäeucn'); 

回報

aäeucn 

如果我我的代碼更改爲

SET parsedString = REPLACE (parsedString, 'ä', 'a'); 

它在某種程度上工作並返回

aaeucn 

沒有人有任何想法如何使用REPLACE( )與CHAR()?我不想指定任何可能的字符。

+0

我意識到MySQL的ASCII碼與PHP碼不同。使用PHP 228返回ä,使用MySQL ASCII('ä')返回195.但是,如果我嘗試使用REPLACE()和CHAR(195使用ASCII),它也不起作用。 – SpaceHeroGuide

回答

0

你可以嘗試

REPLACE(CONVERT('aäeucn' USING ascii), '?', 'a') 

當您轉換國際字符的ASCII,所有非ASCII字符用文字表示的「?」字符。那麼你不必做循環(所以它可能會運行得更快)。

還可以考慮在URL中編碼國際字符的其他方法。
http://www.w3.org/International/articles/idn-and-iri/


回覆您的評論:

如果你需要一個字符一個字符替換,我不會做它的SQL函數。 MySQL函數效率不高,編碼和調試它們很尷尬。我建議將utf8字符串取回到應用程序中,並在那裏進行字符轉換。

您沒有指定您正在使用哪種應用程序編程語言,但爲了什麼值得,PHP支持一個函數strtr(),可以用於此場景。甚至還有在手冊中以ASCII字符映射國際化字符的例子: http://php.net/strtr

$addr = strtr($addr, "äåö", "aao"); // That was easy! 

該解決方案將遠遠更快,更容易的代碼比MySQL存儲功能。

+0

這會起作用,但它會用'a'代替任何特殊字符。但是我想用'a'代替ä,á,â,...。 é,ê,...與e等。 – SpaceHeroGuide

+0

好吧,然後我堅持使用我的PHP解決方案。謝謝! – SpaceHeroGuide