

Rails 3.2.13 + MySQL 5 を使っています。

MySQL の Collation が collate utf8_unicode_ci となっています。  
この機能の存在自体知らなくて全角カタカナのデータに対し全角平仮名で検索マッチしたのでびっくりしました。

で、とあるお客様のデータは **半角カタカナ** で登録されていました。（不吉な匂い!?）  
それでもいい感じで検索してくれるのですが、なぜか「スズキ」や「すずき」がマッチしないことが判明しました。

[code]

    > 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"]
    
[/code]

これは何故でしょうか？ご教示頂ければ幸いです。

ちなみに「フクダ／ふくだ」はマッチします...

[code]

    User.where("kana LIKE '%ﾌｸﾀﾞ%'").count # => 9
    User.where("kana LIKE '%ふくだ%'").count  # => 9
    User.where("kana LIKE '%フクダ%'").count  # => 9
    
[/code]

ググると最近の記事、[「utf8_unicode_ci
に対する日本の開発者の見解」](http://blog.kamipo.net/entry/2015/03/08/145045)が気になってます。


CC BY-SA 3.0
2015-03-31T07:22:30.297
8600
2015-04-02T07:33:47.113
2015-04-02T07:33:47.113
7208
7208
question
ruby-on-rails mysql rails-activerecord
MySQL の collate utf8_unicode_ci で「スズキ」がマッチしない


半角カナの「ｽﾞ」は「ｽ」と「ﾞ」の2文字なので「ズ」にはマッチしないのではないかと思います。

「ﾌｸﾀﾞ」は「フクダ」が「ﾌｸﾀ」にマッチし、後ろの「ﾞ」はワイルドカードの「%」にマッチしているのだと思います。

なお、LIKE ではなく = だと「ｽｽﾞｷ」と「スズキ」はマッチします。  
LIKE は1文字ずつマッチングを行いますが、= は正規化してマッチングするためのようです。

<http://mysql.gr.jp/mysqlml/mysql/msg/15636> が参考になるかも知れません。  
(半角カナが全角に変換されてしまってるのでちょっとわかりにくいですが、心の目で読んでください)


CC BY-SA 3.0
2015-03-31T08:54:22.237
8608
2015-03-31T09:06:25.777
2015-03-31T09:06:25.777
3249
3249
8600
answer