web-dev-qa-db-ja.com

MySqlでアクセントに敏感な検索を行う方法

Utf8の一般的なci照合を使用したMySQLテーブルがあります。表には、2つのエントリがあります。

悪い
abád

私は次のようなクエリを使用しています:

SELECT *  FROM `words` WHERE `Word` = 'abád'

クエリ結果は両方の単語を提供します:

悪い
abád

MySQLにアクセント付きの単語だけを検索させたいことを示す方法はありますか?クエリにのみ返すようにしたい

アバード

私もこのクエリを試してみました:

SELECT *  FROM `words` WHERE BINARY `Word` = 'abád'

結果は得られません。お手伝いありがとう。

59
Chris

そのフィールドでの検索が常にアクセントを区別する場合は、フィールドの照合をutf8_binとして宣言し(utf8でエンコードされたバイトが等しいかどうかを比較します)、またはアクセント付きとunを区別する言語固有の照合を使用しますアクセント付き文字。

col_name varchar(10) collate utf8_bin

検索は通常、アクセントを区別しないが、この検索の例外を作成する場合は、試してください。

WHERE col_name = 'abád' collate utf8_bin
84
user8599

私のバージョン(MySql 5.0)では、大文字と小文字を区別せず、アクセントを区別して検索するためのutf8文字セット照合は使用できません。 utf8のアクセントに敏感な照合は、utf8_binのみです。ただし、大文字と小文字も区別されます。

私の回避策は、次のようなものを使用することです。

SELECT * FROM `words` WHERE LOWER(column) = LOWER('aBád') COLLATE utf8_bin
13
David

将来の参考のために、MySQLのバグは http://bugs.mysql.com/bug.php?id=19567 です。

3
colan

同じエラーが発生していました。

テーブルの照合順序を(phpMyAdminを介して)utf8_binに変更し、問題を解決しました。

それが役に立てば幸い! :)

1
Silvio Delgado

データベーステーブルの照合タイプが「_ci」で終わるかどうかを確認します。これは大文字と小文字を区別しないことを意味します...

「_ci」なしで同じまたは最も近い名前の照合に変更します...

たとえば、「utf8_general_ci」を「utf8_bin」に変更しますMke

1
Mike

受け入れられた答えは良いですが、代わりにCOLLATE utf8mb4_binを使用する必要があるかもしれないことに注意してください!

WHERE col_name = 'abád' collate utf8mb4_bin

上記は次のようなエラーを修正します:

MySQLによると、ドキュメント1253-収集 'utf8_bin'はCHARACTER SET 'utf8mb4'では無効です

0
Robert Sinclair

さて、あなたはutf8_general_ci照合が何であるかを説明しました(a、á、à、â、ä、åはすべて比較でaと等しい)。

MySQLサーバー5.1では、utf8_general_ciおよびutf8_unicode_ciに関しても変更が加えられているため、サーバーのバージョンにも依存しています。ドキュメントをよく確認してください。

したがって、MySQLサーバー5.0の場合、utf8_general_ciではなくutf8_unicode_ciを使用しますが、これは明らかにユースケースにとって間違っています。

0
Tonci Grgin
SELECT *  FROM `words` WHERE column = 'abád' collate latin1_General_CS 

(またはcsを含む照合)

0
cjk

Mysql内で文字の16進変数HEX()を検索し、プログラミング言語内で同様の関数を使用して、これらに一致させることができます。これは、人が人の最初の文字を選択できるリストを作成しているときにうまくいきました。

0
Ólafur Waage

これは、utf8_general_ciのデータベース内のMySqlサーバー5.1で、アクセントを区別せず、大文字と小文字を区別しない検索で機能します。列はLONG​​BLOBです。

select * from words where '%Word%' LIKE column collate utf8_unicode_ci

select * from words where'%Word%' LIKE column collate utf8_general_ci

結果は大文字と小文字を区別しますが、アクセントは区別しません。

0