2011-01-20 9 views
1

私はそれが奇妙な音を知っているが、これを見て:MySqlはutf-8文字列を正しく比較していませんか?

mysql> select * from tbl_list_charset where word='aê'; 
+------+ 
| word | 
+------+ 
| aª | 
+------+ 

データは、Pythonプログラムの読み込みとテーブルに挿入するUTF-8文字列を含むファイル、から来ています。 word列が一意に定義されているため、の挿入は失敗します。

ファイル内の文字列のUTF-8表現である:

AE = 61 C3 AA
aª= 61 C2のAA

マイ環境:Linuxでは、Pythonの2.6.4 MySQL 5.0.77コミュニティ版

...私はそれはバグではありませんかなり確信しているが、私は私が間違っているのかの無知だ

+2

この列ではどのような照合が行われますか?おそらくあなたの問題がどこにあるのでしょうか。 –

+1

おそらく関連しています:http://stackoverflow.com/questions/4018950 –

+0

@Michael Madsen:私は新しいものがありませんでした。 – davka

答えて

1

照合によって、どの文字が「等しい」と比較されるかが決まります。そして、はい、これらの状況のかなりの数があります。あなたはutf8_bin照合を試すことができますが、この問題はありませんが、大文字と小文字が区別されます。ビンの照合は厳密に比較され、エンコーディングは選択されたエンコーディングに合わせて分離されます。そしてそれが完了すると、manhyプログラミング言語が文字列を比較するのと同じように、バイナリベースで比較が行われます。

この極値と現在の照合の間に何か必要な場合は、カスタム照合を行うことができます。あるいは、ある列を別の列に格納し、別の列を使用して特定の目的で各列を使用することで、「十分に良い」ことができるかもしれません。

+0

ありがとう。この話題を調べる必要があることがわかります。大文字と小文字を区別するのは私にとっては大丈夫ですので、utf8_binはおそらく解決策です。私はこのためにmysqlを正しく設定する方法を学ぶ必要があります。 – davka

1

mysqlクライアントプログラムとPythonアプリケーションでUTF-8を使用していますか?
I.他のクエリを実行する前にmysql --default-character-set=utf8とPythonで少なくとも1つのSET NAMES='utf8'を発行してください。

+0

mysql --default-character-set = utf8を使用した結果、 'ae'は' ae'になりました。私は、クライアントの変更がサーバーのさまざまな動作をどのように引き起こしたのか理解していません。 – davka

+1

データベースやテーブルに大文字と小文字を区別しない照合が既にあると思います。 'utf8_general_ci'は' ae'を 'ae'と比較します(circonflexeと' e'は基本的に 'e'です)。しかし、クライアントのデフォルト文字セットとして 'utf8'を使用しないと、大文字小文字を区別しないマッチングでも一致しない'aª'と 'aê'を比較するでしょう。ありがとう。 – Archimedix

関連する問題