私は照合と戦っています。大文字と小文字を区別しないが、「a」と「à」を区別する単語の一意のインデックスを持つテーブルを作成したいと考えています。つまり、「de」と「dé」は 2 つの異なるエントリである必要がありますが、de、De、DE、dE は同じである必要があります。
仕事をするutf8照合はありますか(そうではないようです)?照合順序を使用しないように mysql に指示する方法はありますか? 別の解決策はありますか?単語を小文字または大文字に変更したくない
ありがとう
私は照合と戦っています。大文字と小文字を区別しないが、「a」と「à」を区別する単語の一意のインデックスを持つテーブルを作成したいと考えています。つまり、「de」と「dé」は 2 つの異なるエントリである必要がありますが、de、De、DE、dE は同じである必要があります。
仕事をするutf8照合はありますか(そうではないようです)?照合順序を使用しないように mysql に指示する方法はありますか? 別の解決策はありますか?単語を小文字または大文字に変更したくない
ありがとう
その仕事をするutf8照合はありますか(そうではないようです)?
MySQLに同梱されている照合では、これは行われません。utf8_*_ci
照合はアクセントのバリエーションを区別せずutf8_bin
、照合は大文字と小文字を区別します。
照合を使用しないようにmysqlに指示する方法はありますか?
テキストの比較には常に照合が必要です(照合なしでテキストを比較することは無意味です)。照合を完全に使用しないようにするには、テキストをバイナリ文字列にキャストする必要があります(たとえば、BINARY
演算子を使用します)。この場合、文字列はバイナリエンコーディングによって比較されます。
ただし、これにより、まったく同じ文字が異なる方法でエンコードされている場合でも、違いが生じます(発生する可能性があります)。したがって、代わりにutf8_bin
照合を使用する必要があります。照合では、文字がコードポイントによって比較されます(ただし、前述のように、これは大文字と小文字で区別されます)。
解決策はありますか?言葉を小文字や大文字に変えたくない
UPPER()
またはLOWER()
関数を使用して式の大文字と小文字を変更し(基になるデータは変更されないことに注意してください)、utf8_bin
照合を使用して比較を実行することをお勧めします。したがって、異なる大文字小文字は同等ですが、他のすべての違い(アクセントだけでなく、収縮と拡張も含む)は同等ではありません。例えば:
SELECT col FROM my_table WHERE UPPER(col) LIKE UPPER('de') COLLATE utf8_bin
sqlfiddleでそれを参照してください。
または、独自の照合を追加することもできますが、(MySQLを再コンパイルしない限り)それを定義する必要があります。これに関連しutf8_unicode_ci
て、すべてのアクセントバリエーションの重みをリセットする必要があります。誰がすでにそれを行っているか、またはプログラムでルールを作成できること)。