Utf8の一般的なci照合を使用したMySQLテーブルがあります。表には、2つのエントリがあります。
悪い
abád
私は次のようなクエリを使用しています:
SELECT * FROM `words` WHERE `Word` = 'abád'
クエリ結果は両方の単語を提供します:
悪い
abád
MySQLにアクセント付きの単語だけを検索させたいことを示す方法はありますか?クエリにのみ返すようにしたい
アバード
私もこのクエリを試してみました:
SELECT * FROM `words` WHERE BINARY `Word` = 'abád'
結果は得られません。お手伝いありがとう。
そのフィールドでの検索が常にアクセントを区別する場合は、フィールドの照合をutf8_binとして宣言し(utf8でエンコードされたバイトが等しいかどうかを比較します)、またはアクセント付きとunを区別する言語固有の照合を使用しますアクセント付き文字。
col_name varchar(10) collate utf8_bin
検索は通常、アクセントを区別しないが、この検索の例外を作成する場合は、試してください。
WHERE col_name = 'abád' collate utf8_bin
私のバージョン(MySql 5.0)では、大文字と小文字を区別せず、アクセントを区別して検索するためのutf8文字セット照合は使用できません。 utf8のアクセントに敏感な照合は、utf8_binのみです。ただし、大文字と小文字も区別されます。
私の回避策は、次のようなものを使用することです。
SELECT * FROM `words` WHERE LOWER(column) = LOWER('aBád') COLLATE utf8_bin
将来の参考のために、MySQLのバグは http://bugs.mysql.com/bug.php?id=19567 です。
同じエラーが発生していました。
テーブルの照合順序を(phpMyAdminを介して)utf8_binに変更し、問題を解決しました。
それが役に立てば幸い! :)
データベーステーブルの照合タイプが「_ci」で終わるかどうかを確認します。これは大文字と小文字を区別しないことを意味します...
「_ci」なしで同じまたは最も近い名前の照合に変更します...
たとえば、「utf8_general_ci」を「utf8_bin」に変更しますMke
受け入れられた答えは良いですが、代わりにCOLLATE utf8mb4_binを使用する必要があるかもしれないことに注意してください!
WHERE col_name = 'abád' collate utf8mb4_bin
上記は次のようなエラーを修正します:
MySQLによると、ドキュメント1253-収集 'utf8_bin'はCHARACTER SET 'utf8mb4'では無効です
さて、あなたはutf8_general_ci照合が何であるかを説明しました(a、á、à、â、ä、åはすべて比較でaと等しい)。
MySQLサーバー5.1では、utf8_general_ciおよびutf8_unicode_ciに関しても変更が加えられているため、サーバーのバージョンにも依存しています。ドキュメントをよく確認してください。
したがって、MySQLサーバー5.0の場合、utf8_general_ciではなくutf8_unicode_ciを使用しますが、これは明らかにユースケースにとって間違っています。
SELECT * FROM `words` WHERE column = 'abád' collate latin1_General_CS
(またはcsを含む照合)
Mysql内で文字の16進変数HEX()を検索し、プログラミング言語内で同様の関数を使用して、これらに一致させることができます。これは、人が人の最初の文字を選択できるリストを作成しているときにうまくいきました。
これは、utf8_general_ciのデータベース内のMySqlサーバー5.1で、アクセントを区別せず、大文字と小文字を区別しない検索で機能します。列はLONGBLOBです。
select * from words where '%Word%' LIKE column collate utf8_unicode_ci
と
select * from words where'%Word%' LIKE column collate utf8_general_ci
結果は大文字と小文字を区別しますが、アクセントは区別しません。