2

MySQLで次のクエリがあります。

SELECT id FROM unicode WHERE `character` = 'a'

このテーブルunicodeには、各Unicode文字とID(整数エンコード値)が含まれています。テーブルの照合はutf8_unicode_ciに設定されているため、上記のクエリは97(文字「a」)のみを返すと予想していました。代わりに、多くの「a」のような文字のIDを含む119行を返します。

aAÃ..。

文字の大文字と小文字とマルチバイトの性質の両方を無視しているようです。

何か案は?

4

3 に答える 3

2

Unicode文字セットで文書化されているように:

MySQLは、 http://www.unicode.org/reports/tr10/xxx_unicode_ciで説明されているUnicode照合アルゴリズム(UCA)に従って照合を実装します。照合では、バージョン4.0.0 UCAウェイトキーを使用します:http://www.unicode.org/Public/UCA/4.0.0/allkeys-4.0.0.txt

完全な照合チャートは、この照合では、大文字と小文字またはアクセント/装飾に関係なく、基本文字のほとんどのバリエーションが同等であることを明確にしています。

正確な文字のみを照合する場合は、などのバイナリ照合を使用する必要がありますutf8_bin

于 2012-09-14T21:12:15.583 に答える
2

テーブルの照合は問題の一部です。_ci照合を使用するMySQLは、これらすべての「a」を同じ文字のバリアントとして扱います。

_cs照合に切り替えると、エンジンは「a」と「A」、および「á」と「Á」を区別しますが、「a」と「á」は同じ文字として扱われる場合があります。

類似の文字の同等性を完全に無視して、正確な比較セマンティクスが必要な場合は、BINARY比較演算子を使用できます

SELECT id FROM unicode WHERE BINARY character = 'a'
于 2012-09-14T21:10:30.747 に答える
1

照合でのciinは、大文字と小文字を区別しないことを意味します。大文字と小文字を区別する照合(cs)に切り替えて、探している結果を取得します。

于 2012-09-14T21:04:30.940 に答える