我尝试创建一个MySQL函数来将给定的字符串解析为我可以在URL中使用的版本。所以我必须删除一些特殊字符,并尝试使用循环来保持代码简单,而不必指定任何字符。
我目前的代码是:
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
有没有人知道如何使用CHAR()使用REPLACE()?我不想指定任何可能的角色。
答案 0 :(得分: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()
。甚至有一个将i18n字符映射到手册页中的ascii字符的示例:
http://php.net/strtr
$addr = strtr($addr, "äåö", "aao"); // That was easy!
该解决方案比MySQL存储功能更快更容易编码。