質問: Rails 3.2.13 + MySQL 5 を使っています。 MySQL の Collation が collate utf8_unicode_ci となっています。 この機能の存在自体知らなくて全角カタカナのデータに対し全角平仮名で検索マッチしたのでびっくりしました。 で、とあるお客様のデータは**半角カタカナ**で登録されていました。(不吉な匂い!?) それでもいい感じで検索してくれるのですが、なぜか「スズキ」や「すずき」がマッチしないことが判明しました。 ``` > User.where("kana LIKE '%スズキ%'").count (4.1ms) SELECT COUNT(*) FROM `users` WHERE (kana LIKE '%スズキ%') => 42 > User.where("kana LIKE '%すずき%'").count (2.6ms) SELECT COUNT(*) FROM `users` WHERE (kana LIKE '%すずき%') => 0 > User.where("kana LIKE '%スズキ%'").count (2.6ms) SELECT COUNT(*) FROM `users` WHERE (kana LIKE '%スズキ%') => 0 > pp User.where("kana LIKE '%スズキ%'").limit(10).map{|x| x.kana.sub(/...$/, 'xxx')} User Load (1.1ms) SELECT `users`.* FROM `users` WHERE (kana LIKE '%スズキ%') LIMIT 10 ["スズキ xxx", "スズキxxx", "スズキタケxxx", "スズキxxx", "スズキノxxx", "スズキリュxxx", "スズキxxx", "スズxxx", "スズキ タxxx", "スズキ xxx"] ``` これは何故でしょうか?ご教示頂ければ幸いです。 ちなみに「フクダ/ふくだ」はマッチします... ``` User.where("kana LIKE '%フクダ%'").count # => 9 User.where("kana LIKE '%ふくだ%'").count # => 9 User.where("kana LIKE '%フクダ%'").count # => 9 ``` ググると最近の記事、「utf8_unicode_ci に対する日本の開発者の見解」が気になってます。
回答: 半角カナの「ズ」は「ス」と「゙」の2文字なので「ズ」にはマッチしないのではないかと思います。 「フクダ」は「フクダ」が「フクタ」にマッチし、後ろの「゙」はワイルドカードの「%」にマッチしているのだと思います。 なお、LIKE ではなく = だと「スズキ」と「スズキ」はマッチします。 LIKE は1文字ずつマッチングを行いますが、= は正規化してマッチングするためのようです。 が参考になるかも知れません。 (半角カナが全角に変換されてしまってるのでちょっとわかりにくいですが、心の目で読んでください)