3

特定の文字列を URL で使用できるバージョンに解析する 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

CHAR() で REPLACE() を使用する方法を知っている人はいますか? 可能なキャラクターを指定したくありません。

4

1 に答える 1

1

あなたは試すことができます

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 ストアド関数よりもはるかに高速でコーディングが簡単です。

于 2012-12-26T17:27:14.707 に答える