web-dev-qa-db-ja.com

utf8_binとutf_unicode_ci

私のテーブルのウェブサイト

Website_Name//column name
Google
Facebook
Twitter
Orkut
Frype
Skype
Yahoo
Wikipedia

私はutf8_bin照合を使用して、ウェブサイトでウィキペディアを検索するためのクエリは

Select Website_Name from Website where lower(Website_Name)='wikipedia'

そして、utf8_unicode_ciを使用すると、ウェブサイトでウィキペディアを検索するための私の選択クエリは

Select Website_Name from Website where Website_Name='wikipedia'

次のクエリに応じて、どの照合が最適であるかを知りたい

32
user1432124

必要なものに依存します。

utf8_bin照合順序は、純粋にUnicode コードポイント 値に基づいて文字列を比較します。すべてのコードポイントの値が同じ場合、文字列は等しくなります。ただし、マークを合成するための異なる構成の文字列(合成と分解)または標準的には同等であるが同じコードポイント値を持たない文字がある場合、これはバラバラになります。場合によっては、utf8_binは、期待するときに文字列が一致しない結果になります。理論的には、utf8_binは、文字列にUnicode正規化が適用されないため最速ですが、必要なものではない場合があります。

utf8_general_ciは、言語固有のルールを使用してUnicode正規化を適用し、大文字と小文字を区別せずに文字列を比較します。 utf8_general_csは同じことをしますが、大文字と小文字を区別して文字列を比較します。

61
Delan Azabani

個人的にはutf8_unicode_ci、検索したい結果に対してレターケースが一般的に重要でないと思われる場合。

照合順序は、実行時だけでなく、MySQLがインデックスを作成するときにも使用されます。したがって、これらの列のいずれかがインデックスに表示される場合、その照合の比較ルールに従ってデータを検索することは、これまでにないほど高速になります。

大文字と小文字を区別しないマッチングが必要ない場合は、上限または下限を適用しないでください。代わりに、utf8列の前にBINARYキーワードを適用して、照合による比較ではなくリテラルのコードポイント比較を強制します。

mysql> create table utf8 (name varchar(24) charset utf8 collate utf8_general_ci, primary key (name));
Query OK, 0 rows affected (0.14 sec)

mysql> insert into utf8 values ('Roland');
Query OK, 1 row affected (0.00 sec)

mysql> insert into utf8 values ('roland');
ERROR 1062 (23000): Duplicate entry 'roland' for key 'PRIMARY'
mysql> select * from utf8 where name = 'roland';
+--------+
| name   |
+--------+
| Roland |
+--------+
1 row in set (0.00 sec)

mysql> select * from utf8 where binary name = 'roland';
Empty set (0.01 sec)

これらの場合、MySQLは最初に列値のコピーを作成し、大文字と小文字を変更してから比較を適用する必要があるため、これはlowerまたはupperを使用するよりもはるかに高速になります。 BINARYを設定すると、最初にインデックスを使用して一致を検出し、次に、値が等しくないことが検出されるまでコードポイントごとのコードポイント比較を実行します。これは一般に高速です。

13
Roland Bouman

doctrineによってデフォルトである 'utf8_unicode_ci'を使用していました。

 * @ORM\Table(name = "Table", options={"collate"="utf8_bin"})

私の複合主キーの一部はテキストフィールドで構成されていたため。悲しいことに「utf8_unicode_ci」は「poistný」と「poistny」を同じプライマリキー値として解決し、doctrineフラッシュの挿入でクラッシュしました。コンポジットプライマリキーの一部の照合を変更できませんでした。テーブルを削除して再作成します。他の人の時間を節約できることを願っています。

8
Jiro Matchonson