質問: **クローズされました**。この質問にはより詳細な情報、もしくは明確さが必要です。この質問では現在、回答を受け付けていません。 --- **この質問を改善したいですか?** 投稿を編集から詳細を追加し解決しようとしている問題を明確にしてください。 3年前 にクローズされました。 この質問を改善する **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 はサロゲートペアに非対応なアプリケーション専用と考えていいです。