ハローエンジニア!SEライターのナガヤンです!あなたはお寿司は好きですか?
データベースの有名な問題の一つに「寿司ビール問題」というものあります。
その問題のややこしさに加えて、呼称のユニークさから、しばしばエンジニアたちの語り草になっています。
「寿司ビール問題」とはいったい何なのか、その問題はどうすれば解決できるのかを解説します!
このページの目次
寿司ビール問題とは、MySQL5.7以前において、寿司とビールの絵文字が区別できないという問題です。
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つの選択肢が挙げられます。
MySQL 8.0 では UTF-8 のサポートを改善する計画がされており、MySQL8.0.1 から照合順序 utf8mb4_ja_0900_as_cs が追加されました。
この utf8mb4_ja_0900_as_cs は次のような特徴があります。
ご覧の通り日本語圏の比較判断に即した照合順序になっています。特に全角カタカナと半角カタカナはありがちな表記ゆれなので、同じとみなしてくれるのは嬉しいですね!
寿司ビール問題の根本は、MySQL のシステムに起因する問題です。そのため、ほかのRDBMS(関係データベース管理システム)では、そもそも起きないということもあります。例えばMySQL同様に、フリーのRDBMSである PostgreSQL では寿司ビール問題は起こりません。
MySQLの「寿司とビール」問題、面倒臭いね。「PostgreSQLならそんなことはないよ」って言われたら使うの検討するレベルにイヤな感じ。
— Tomoki Hasegawa (@tomzoh)March 23, 2015
実際、この寿司ビール問題が大きく取り上げられた時期には、いくつかの案件でPostgreSQLへの移行の話がなされていました。
ユーザー体験の点から考えてみても、絵文字が使えないストレスというのはサイトの印象も悪くなるので避けるべきことです。
安定性の面でも世界的に運用実績がある PostgreSQL は有力な選択肢といえます。
新しいデータベースを導入できるに越したことはないのですが、システム的な都合でどうしても導入できない場合もあります。そんなときは、照合順序に utf8mb4_bin を指定することで絵文字を区別できるようになります。
そのほか、デフォルトの utf8mb4_general_ci と比べて、 アルファベットの大文字と小文字も区別する(「A」≠「a」)ため、そこは注意が必要になります。
寿司ビール問題の解決方法についてまとめると、次のようになります。
システムや予算など、前提によって採れる選択肢は変わってきます。ただし、一度の選択が将来に大きな影響を与えることも少なくないので、よりベストな選択肢で解決していきたいですね!
サーチバンクではマシュマロを設置しています。
ライターに聞いてみたい疑問や質問を募集中です。
記事の感想やご意見なども、よかったらお聞かせください。
⇒https://marshmallow-qa.com/search_bank