11

「ニックネーム」という列があり、utf-8でエンコードされ、varchar(20)であるユーザーテーブルがあり、テーブルはInnoDBにあります。ニックネームが 'gunni' のレコードと、ニックネームが 'günni' のレコードが 2 つあります。この列に一意のインデックスを適用しようとすると、mysql で次のエラーが発生しました。

エラー 1062 (23000) 263 行目: キー 2 のエントリ 'gunni' が重複しています

「gunni」という名前のレコードが 1 つしかないデータを確認しました。「günni」レコードを別のレコードに変更してから、一意のインデックスを再度適用すると、すべて正常に動作します。

「günni」と「gunni」が重複するのはなぜですか? ここにそれらの 16 進値があります。これは mysql の hex() 関数で取得します。

グンニ -> 67756E6E69

グンニ -> 67C3BC6E6E69

それらは明らかに異なります。なぜmysqlはこれら2つを同じものとして扱うのですか? または、一意のインデックスについて知らないことがありますか? それとも、これは mysql のバグでしょうか?

4

1 に答える 1

13

これは、使用している照合が原因です。

_ci で終わるものはすべて大文字と小文字を区別しません (アクセント/ウムラウトも区別しません)。そうです、照合順序を変更しない限り、MySQL は "günni" と "gunni" を同じものと見なします。

ドキュメント: http://dev.mysql.com/doc/refman/5.0/en/charset-table.html

于 2010-07-26T05:30:07.040 に答える