照合順序をutf8_unicode_ciにしない理由の一つ

utf8_unicode_ciとutf8_general_ci

どっちにするのか、ちょっと悩みましたが、最近よく言われるのは全文検索の場合
正確性を求めるならutf8_unicode_ci
速度を求めるならutf8_general_ci
ということになるらしいです。

utf8_unicode_ciにしない理由の一つ?

それはLIKE文を書く際の「\」文字に対する処理にあります。
どうやらutf8_unicode_ciにしたフィールドに対する全文検索は下記の書き方だと「\」が検出できなくなっています!

Select * from table where `utf8_unicode_ci` LIKE '%\\\\%';

  • 具体的にこのようなテーブルがあるとします。

  • このような値が格納されています。

  • そしてSQL文を発行してみます。
    • 「utf8_general_ci」に「\」を含むレコードを検索します。

Select * from table where `utf8_general_ci` LIKE '%\\\\%';
結果:

    • 今度は「utf8_unicode_ci」に「\」を含むレコードを検索します。

Select * from table where `utf8_unicode_ci` LIKE '%\\\\%';
結果:

なんと!空行でした!これは何なんでしょう?わかる方がいらっしゃいましたらぜひ、教えてください!

  • ちなみに、下記のように「\」の前の文字を含めればちゃんと結果が出てきます!

Select * from table where `utf8_unicode_ci` LIKE '%字\\\\%';
結果:

原因がわかる方がいらっしゃいましたらぜひ、ぜひ教えてください!