2012-06-12 9 views
5

私はSFについてよく似た質問があることを知っていますが、私は私のことは新しい質問を保証するのに十分だと思います。私はutf8_unicode_ciでutf8として単一の列を持つテーブルを持っています。また、この列には固有のキーがあり、言語コードを示す別の列もあります。この列のデータは、さまざまなスクリプト(ラテン語、さまざまなアクセント、中国語、ロシア語など)にあります。MySQLの大文字と小文字は区別されますがアクセントに敏感なUTF8の一意のキー

問題は、時々、発音区別記号(スペイン語のanoとaño)だけ異なる異なる意味の2つの単語を入力したいと思うことです。 utf8_unicode_ciは大文字と小文字を区別しないため、これらは同じだと思って入力します。それは吸う。理想的には、列全体をある種の照合(大文字と小文字を区別しないでアクセントに敏感です)に切り替えるだけですが、それは存在しないようです。多くの異なるものがこの列を使用していますので、大文字と小文字を区別することを恐れて、列のデフォルトの照合順序をutf8_binに変更しないでください。

だから、私は、この列をヒットする多くの既存のクエリでデフォルトの大文字と小文字の区別に影響を及ぼさない解決策が必要だと思いますが、分音記号だけが異なる単語を追加できます。アイデア?もし私がする必要があれば、私はユニークなキー制約をutf8_binに切り替えるでしょう。

答えて

0

私が考えることができる(あなたのニーズに合った照合を見つけることなしに)唯一のことは、差別化を扱うアプリケーション層(MySQLの外)で何かを変更することです。

たとえば、大文字と小文字は区別されないので、データベース内のすべての行の大文字小文字を低くするために、プログラムで何かを行うことができます。照合順序をutf8_binに変更します。

次に、データベースに入る前にすべてを小文字に変換することができます(これは分音文字には影響しません)。そうすれば、複数のケースを入力しようとするとエラーが発生します。テーブルに入る前提条件に数行のコードを変更するだけでよいので、分音問題はありません。

+1

一部の大文字には、同等の小文字はありません。いくつかは同等の複数の小文字を持っています。それは混乱のようなものです。 –

0

ここでは、フラットタイヤ(車輪を改造)を改造する必要はありません。

utf8_spanish_ci(現代スペイン語)と utf8_spanish2_ci(伝統的なスペイン)

これらは、Nとnが一緒に照合する必要があることを知っているだけでなく、十分な言語を知っている:

MySQLで2スペイン語の照合順序があります。しかし、ÑとñはNとOの間の異なる文字です。スペイン語では、Ñは実際にはアクセントではなく異なる文字です。

カラムの照合順序をutf8_spanish_ciに設定すると、すべての設定が適切に動作します。

+0

ありがとう、しかし、私が言及したように、それは私が心配しているスペイン語だけではありません。さまざまな言語のものがあります。 – Eli

+0

Hmm。 Unicodeの照合を夢見ている人々は、優れた言語学者です。すべてのローマ字のアルファベットの言語に対して正しいことをした普遍的な解決策があれば、それはそれを実装したでしょう。ユーザーの言語に基づいて、言語に敏感なクエリを実行する必要がある場合があります。 WHERE文にCOLLATE句を置くことができます。 –

関連する問題