3

私は照合と戦っています。大文字と小文字を区別しないが、「a」と「à」を区別する単語の一意のインデックスを持つテーブルを作成したいと考えています。つまり、「de」と「dé」は 2 つの異なるエントリである必要がありますが、de、De、DE、dE は同じである必要があります。

仕事をするutf8照合はありますか(そうではないようです)?照合順序を使用しないように mysql に指示する方法はありますか? 別の解決策はありますか?単語を小文字または大文字に変更したくない

ありがとう

4

1 に答える 1

5
  1. その仕事をするutf8照合はありますか(そうではないようです)?

    MySQLに同梱されている照合では、これは行われません。utf8_*_ci照合はアクセントのバリエーションを区別せずutf8_bin、照合大文字と小文字を区別します。

  2. 照合を使用しないようにmysqlに指示する方法はありますか?

    テキストの比較には常に照合が必要です(照合なしでテキストを比較することは無意味です)。照合を完全に使用しないようにするには、テキストをバイナリ文字列にキャストする必要があります(たとえば、BINARY演算子を使用します)。この場合、文字列はバイナリエンコーディングによって比較されます。

    ただし、これにより、まったく同じ文字が異なる方法でエンコードされている場合でも、違いが生じます(発生する可能性があります)。したがって、代わりにutf8_bin照合を使用する必要があります。照合では、文字がコードポイントによって比較されます(ただし、前述のように、これ大文字と小文字で区別されます)。

  3. 解決策はありますか?言葉を小文字や大文字に変えたくない

    UPPER()またはLOWER()関数を使用しての大文字と小文字を変更し(基になるデータは変更されないことに注意してください)、utf8_bin照合を使用して比較を実行することをお勧めします。したがって、異なる大文字小文字は同等ですが、他のすべての違い(アクセントだけでなく、収縮と拡張も含む)は同等ではありません。例えば:

    SELECT col FROM my_table WHERE UPPER(col) LIKE UPPER('de') COLLATE utf8_bin
    

    sqlfiddleでそれを参照してください。

    または、独自の照合を追加することもできますが、(MySQLを再コンパイルしない限り)それを定義する必要があります。これに関連しutf8_unicode_ciて、すべてのアクセントバリエーションの重みをリセットする必要があります。誰がすでにそれを行っているか、またはプログラムでルールを作成できること)。

于 2012-05-22T14:30:59.653 に答える