検索クエリのアクセントを鈍感にする方法はありますか?
列とテーブルの照合順序はutf8_polish_ciであり、変更したくありません。
例ワード:トルン
select * from pages where title like '%torun%'
「トルン」が見つかりません。どうやってやるの?
実行時に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でエンコードされている必要があります。
これは極端な状況では機能しませんが、列の照合順序をUFT8に変更してみてくださいutf8_unicode_ci
。その場合、アクセント付きの文字は、アクセントのない文字と同じになります。
SOUNDEXを試すことができます:
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex
これは、2つの弦をどのように聞こえるかによって比較します。しかし、これは明らかにもっと多くの結果をもたらします。