質問: **utf8mb4について** ・誰がどこで決めた仕様? ・ISOか何かで文字コード体系として決まっているのでしょうか? ・それとも、MySQL独自の仕様? **バイト数について** ・「日本語1文字3バイト」+「左記で扱えない文字を4バイト」で処理+「絵文字を4バイト」で処理という感じですか? ・絵文字が4バイトというのは何の仕様に基づいているのでしょうか? UTF8??
回答: まずは Unicode 側の仕様 Unicode の世界では世界各地の「文字」を扱いますが、その文字1つ1つに抽象的な「文字コードポイント」を割り振っています。「文字」をファイルにセーブするとき、そのコードポイントをどのような「バイトの列」にするかを決めて取り扱うことになります。この、具体的な変換方法を「エンコーディング」と呼びます。この辺の話はあなた自身の質問 UTF-8で日本語1文字が3バイトなのはなぜ? にて述べられているわけです。 Unicode には BMP (Basic Multilingual Plane) という概念があって これは UNICODE 3.0 までで追加された「よく使うであろう」文字のセットのことで BMP にある文字は UTF-8 エンコーディングでは 3byte となります。 BMP 外の文字は UTF-8 エンコーディングで 4byte となる仕様です。 日本語関連では「ひらがな」「かたかな」「よく使う漢字」は Unicode 1.1 で追加された関係でこの BMP の中に配置されています。そのため UTF-8 エンコーディングで表記すると 3byte になります。「絵文字」などは Unicode 6.0 などで追加された関係で BMP に入っていません。そのため「絵文字」を UTF-8 エンコーディング表記すると 4byte になります。 さてここからは [mysql](/questions/tagged/mysql "'mysql' のタグが付いた質問を表示") の仕様で mysql のデーターベース文字エンコーディング utf8 は BMP に登録されている文字だけを取り扱う代わりに、1文字3バイトのディスク空間を占有するという仕様です。非 BMP 文字は格納できないことになっています。 mysql のデーターベース文字エンコーディング utf8mb4 は BMP にない文字も取り扱えるようになったもので、非 BMP 文字は、1文字4バイトのディスク空間を占有するという仕様です。ただし utf8mb4 を使うアプリケーションソフトのほうにも非 BMP 文字を取り扱う機能が必要となります (特に UTF-16 を使っているアプリケーションはサロゲートペアに対応していなければならない) 。 いまどき的には常に utf8mb4 を採用しておけば間違いないでしょう。utf8 はサロゲートペアに非対応なアプリケーション専用と考えていいです。