web-dev-qa-db-ja.com

MySQLのアクセントに依存しない検索クエリ

検索クエリのアクセントを鈍感にする方法はありますか?

列とテーブルの照合順序はutf8_polish_ciであり、変更したくありません。

例ワード:トルン

select * from pages where title like '%torun%'

「トルン」が見つかりません。どうやってやるの?

22
Okan Kocyigit

実行時にSQLクエリで照合順序を変更できます。

...where title like '%torun%' collate utf8_general_ci

ただし、実行時にその場で照合順序を変更すると、mysqlがインデックスを使用する可能性がなくなるため、大きなテーブルでのパフォーマンスがひどくなる可能性があることに注意してください。

または、列をsearchable_titleなどの別の列にコピーして、その照合順序を変更することもできます。実際には、この種の作業を行うのが一般的です。データをコピーしますが、特定のワークロード/目的に合わせて最適化されたわずかに異なる形式でデータを取得します。複製された列の同期を維持するための優れた方法として、トリガーを使用できます。この方法は、インデックスが付けられている場合、うまく機能する可能性があります。

注-データベースにhtmlエンティティではなく、実際にこれらの文字が含まれていることを確認してください。また、接続の文字セットも重要です。上記は、たとえばset names utf8のように set names を介してutf8に設定されていることを前提としています。

そうでない場合は、リテラル値に introducer が必要です

...where title like _utf8'%torun%' collate utf8_general_ci

もちろん、SQLクエリの残りの部分がエンコードされていない場合でも、一重引用符で囲まれた値は実際にはutf8でエンコードされている必要があります。

25
goat

これは極端な状況では機能しませんが、列の照合順序をUFT8に変更してみてくださいutf8_unicode_ci。その場合、アクセント付きの文字は、アクセントのない文字と同じになります。

6
Kieran

SOUNDEXを試すことができます:

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex

これは、2つの弦をどのように聞こえるかによって比較します。しかし、これは明らかにもっと多くの結果をもたらします。

1
Remy