寿司ビール問題について、問題の本質と解決法を解説!

記事更新日: 2020/12/01

ライター: ナガヤン

ハローエンジニア!SEライターのナガヤンです!あなたはお寿司は好きですか?

データベースの有名な問題の一つに「寿司ビール問題」というものあります。

その問題のややこしさに加えて、呼称のユニークさから、しばしばエンジニアたちの語り草になっています。

「寿司ビール問題」とはいったい何なのか、その問題はどうすれば解決できるのかを解説します!

寿司ビール問題とは

寿司ビール問題とは、MySQL5.7以前において、寿司とビールの絵文字が区別できないという問題です。

MySQLとは

MySQLは、オープンソースのリレーショナルデータベース管理システム(いわゆる「データベース」)で、WordPressやphpBBなどのWebアプリケーションで利用されています。FacebookやTwitter、Youtubeなど多くの有名なWebサイトでも使用されている。

MySQLでは、UTF-8の文字列を扱うutf8というcharacter-set(文字集合)がありますが、1バイトから3バイトまでの文字しか扱うことができません。絵文字のような、4バイトのUTF-8文字を扱う場合はutf8mb4を指定する必要があります。utf8mb4にすることで、絵文字をデータベースに登録・参照することができます。

これでオッケーと思いきや、照合順序(Collation)という壁が現れます。デフォルトの照合順序は utf8mb4_general_ci となっています。ただし、この utf8mb4_general_ci は絵文字の区別がつかないのです・・!

絵文字の区別がつかないということは、ビールの絵文字だけを取り出したいときに寿司の絵文字が出てしまうのです。駆けつけ一杯で寿司が出てきたら正直ギョッとしますよね。ここが寿司ビール問題の本質です。

寿司ビール問題を解決するには

寿司ビール問題を解決するにはどのようにしたらよいのでしょうか?

メジャーな解決方法としては、次の3つの選択肢が挙げられます。

寿司ビール問題の解決方法一覧
  • MySQL8.0以降で、utf8mb4_ja_0900_as_cs を使う
  • PostgreSQL を導入する
  • 照合順序に utf8mb4_bin を指定する

解決方法その1:MySQL8.0 以降で utf8mb4_ja_0900_as_cs を使う

MySQL 8.0 では UTF-8 のサポートを改善する計画がされており、MySQL8.0.1 から照合順序 utf8mb4_ja_0900_as_cs が追加されました。

この utf8mb4_ja_0900_as_cs は次のような特徴があります。

utf8mb4_ja_0900_as_cs の特徴
  • ひらがなとカタカナは区別しない(例:「ぬ」と「ヌ」は区別されない)
  • 拗音は区別する(例:「びょういん」と「びよういん」は区別される)
  • 濁点と半濁点は区別する(例:「ハハ」と「パパ」は区別される)
  • 半角と全角は区別しない(例:「クモ」と「クモ」は区別されない)
  • 絵文字は区別する(例:寿司の絵文字とビールの絵文字は区別される)
  • アルファベットの大文字と小文字を区別する(例:「a」と「A」が区別される)

ご覧の通り日本語圏の比較判断に即した照合順序になっています。特に全角カタカナと半角カタカナはありがちな表記ゆれなので、同じとみなしてくれるのは嬉しいですね!

解決方法その2:PostgreSQL を導入する

寿司ビール問題の根本は、MySQL のシステムに起因する問題です。そのため、ほかのRDBMS(関係データベース管理システム)では、そもそも起きないということもあります。例えばMySQL同様に、フリーのRDBMSである PostgreSQL では寿司ビール問題は起こりません。

実際、この寿司ビール問題が大きく取り上げられた時期には、いくつかの案件でPostgreSQLへの移行の話がなされていました。

ユーザー体験の点から考えてみても、絵文字が使えないストレスというのはサイトの印象も悪くなるので避けるべきことです。

安定性の面でも世界的に運用実績がある PostgreSQL は有力な選択肢といえます。

解決方法その3:照合順序に utf8mb4_bin を指定する

新しいデータベースを導入できるに越したことはないのですが、システム的な都合でどうしても導入できない場合もあります。そんなときは、照合順序に utf8mb4_bin を指定することで絵文字を区別できるようになります。

そのほか、デフォルトの utf8mb4_general_ci と比べて、 アルファベットの大文字と小文字も区別する(「A」≠「a」)ため、そこは注意が必要になります。

まとめ

寿司ビール問題の解決方法についてまとめると、次のようになります。

寿司ビール問題の解決方法一覧
  • MySQL 8.0 以降が利用できる ⇒ MySQL 8.0 以降で、utf8mb4_ja_0900_as_cs を使う
  • PostgreSQL が利用できる ⇒ PostgreSQL を導入する
  • MySQL 5.7 以前を利用せざるをえない ⇒ Collation に utf8mb4_bin を指定する

システムや予算など、前提によって採れる選択肢は変わってきます。ただし、一度の選択が将来に大きな影響を与えることも少なくないので、よりベストな選択肢で解決していきたいですね!

 

PR

サーチバンクではマシュマロを設置しています。
ライターに聞いてみたい疑問や質問を募集中です。
記事の感想やご意見なども、よかったらお聞かせください。
https://marshmallow-qa.com/search_bank

この記事を書いたライター

ナガヤン

こんにちは、SEライターのナガヤンです!
サーチバンクをご覧いただき、ありがとうございます。

現役システムエンジニアの私だからこそできる、便利で楽しくなる情報を発信していきます!

これからの働き方を考えるメディア「JobTier」にて、対談記事を書いていただきました!

この記事に関連するラベル

ページトップへ