2013-07-08 10 views
11

UTF-8- default照合を使用するテーブルがあります。REPLACE()はアクセントの影響を受けません(é= e)?

私は、この表の列は、私のようなクエリを実行すると、この値Café Rouge

を持ってcompanyと呼ばれるがあります。それは、文字é =eを扱うため

select * from company where name ='Cafe Rouge' 

それがこの会社を一覧表示しますが、私が使用している場合replaceコマンドでは、éeとして扱いません。

ので、

select replace('Café Rouge','e','z') 

'Café Rougz'すなわち、それはzéを置き換えるものではありません私を与えます。

いずれかの提案が認められるでしょう

+2

この動作を変更できるかどうかはわかりません。REPLACE()はおそらくバイナリ比較を行っています。単純にéを置き換えることはできませんか? –

+1

なぜ「é」を交換する必要がありますか?おそらく、新しい列 'company_normalized'を作成して、アクセントを付けずに値を置いて、正規化されたスペースなどでトリムしてから、正規化されたバリアントを使い、それ以外の場合は本当の会社名を使用してください。 – sasjaq

+0

No :(それは私は現在、大文字と小文字の区別をしていないので、テーブルをバイナリ照合に変更することはできません。バイナリに変更すると、さまざまな場所で変更が行われます。 – Jeets

答えて

0

私はそうすることはできません。より安全な賭けは、単にそれらの特定の文字を置き換えることです。

1

私はあなたができることの中に、これらの文字列を通常の形で保持する2番目の列を維持することを考えます。たとえば、この列には「CaféRouge」ではなく「Cafe Rouge」が格納されます。例外文字をクエリに投影してから、通常のフォーム列を使用してクエリを実行できます。

0

カフェルージュで選択を行い、返された各結果の希望の列を置き換えないのはなぜですか?

1

置き換えを行う前にASCIIにname列を変換する

SELECT REPLACE(CONVERT(name USING ascii), 'e', 'z') 

を試してみてください。

+0

私はこれも考えましたが、それはデータを破壊し、したがって役に立たない可能性があります。 'CaféÜntenbärger'を想像して' 'Cafz Untenbarger'を完成させるでしょう –

+1

比較のために 'name'データの別のバージョンを使いたい場合は、置き換えられたバージョンをエイリアスでロードして元の 'name'また利用可能である。 あなたの意図をより明確に説明すると役に立ちます。 –

+0

私はあなたの意見を得ていますが、あなたはどのようにmySQLで比較を行いますか?私はそれが可能だとは思わない。 (スクリプト言語が必要です) –

0

これは、mySQLの外部で行う必要があります。 CONVERT()を使用して@Christianによって示されるように

あなたは、MySQL内部の文字列を正規化することができますが、それは存在する任意の他の非ASCII文字を破壊します:

Bürgercafé Römer 

から

Burgercafz Romer 

文字が終わるだろうキリル文字や中国語のような他の文字セットはすべて消去されます。

交換するすべての文字を特に置き換えることをお勧めします。あなたが望む正確何を行うには

replace('Café Rouge','e','z') 
replace('Café Rouge','é','z') 
replace('Café Rouge','è','z') 

、あなたは、PHPなどのプログラミング言語にすべての文字列をロードする必要があると思います。そこ

は、次の操作を行うことができます:

  1. は、データベースから文字列をロードします。 iconv($character, "UTF-8", "ASCII//TRANSLIT");

  2. を使用して文字を正規化各文字

  3. を通じて

  4. ウォーク - ことを確認してくださいそれはUTF-8

  5. スプリットは、その文字に文字列(mb_split()を使用してマルチバイト文字を認識すること)です

    正規化された文字の結果がeの場合は、文字列に置き換える必要があることがわかります。

  6. 変更された文字列をデータベースに書き戻します。

しかし、これは小さなもののように思われるために非常に多くのトラブルのように見えます。あなたは本当にそれが必要だと確信していますか?

+0

ありがとう、私はそれを試みます。 – Jeets

関連する問題