MySQLのutf8mb4とutf8文字セットの違いは何ですか?


341

違いは何であるutf8mb4utf8で文字セットMySQLは

ASCIIUTF-8UTF-16UTF-32エンコーディングについてはすでに知っています。しかしutf8mb4MySQLサーバーで定義されている他のエンコードタイプとのエンコードグループの違いを知りたいです。

utf8mb4ではなく使用することの特別な利点/提案はありutf8ますか?

回答:


391

UTF-8は可変長エンコーディングです。UTF-8の場合、これは1つのコードポイントを格納するために1〜4バイトが必要であることを意味します。ただし、「utf8」(別名「utf8mb3」)と呼ばれるMySQLのエンコーディングは、コードポイントごとに最大3バイトのみを格納します。

したがって、文字セット "utf8" / "utf8mb3"は、すべてのUnicodeコードポイントを格納できません。これは、「Basic Multilingual Plane」と呼ばれる0x000から0xFFFFの範囲のみをサポートします。Unicodeエンコーディングの比較も参照してください。

これは、(同じページの前のバージョンの)MySQLドキュメントがそれについて述べなければならないことです:

utf8 [/ utf8mb3]という名前の文字セットは、文字ごとに最大3バイトを使用し、BMP文字のみを含みます。MySQL 5.5.3以降、utf8mb4文字セットは文字ごとに最大4バイトを使用し、補助文字をサポートします。

  • BMP文字の場合、utf8 [/ utf8mb3]とutf8mb4のストレージ特性は同じです。同じコード値、同じエンコーディング、同じ長さです。

  • 補助文字の場合、utf8 [/ utf8mb3]は文字をまったく格納できませんが、utf8mb4は文字を格納するために4バイトを必要とします。utf8 [/ utf8mb3]は文字をまったく格納できないため、utf8 [/ utf8mb3]列に補助文字がなく、古いバージョンのutf8 [/ utf8mb3]データをアップグレードするときに文字の変換やデータの損失について心配する必要はありません。 MySQL。

したがって、絵文字など、BMPの外側にある文字の格納を列でサポートしたい場合(そして通常はそうしたい場合)は、「utf8mb4」を使用します。参照実際に使用されている最も一般的な非BMP Unicode文字は何ですか?


10
(今のところ)utf8mb4が「必須」であった唯一のケースは、中国語と絵文字です。それを必要とするあいまいなアルファベットがあります。
リックジェームズ

10
暗号化されたパスワードとデータをデータベースに保持するために使用する場合にも必要です。通常のutf8形式を使用して暗号化されたパスワードをmysqlに保存していたため、一部のパスワードでランダムに非常に多くのトラブルが発生し、デバッグが非常に困難でした。しかし、今、私はその理由を知っています。
Mojtaba Rezaeian 2016年

37
@idealideaの暗号化されたデータはバイナリであり、バイナリデータをvarchar列に格納しないでください。:)
CodeCaster 2016年

8
@thomasrutter UTF-8で保存するには、この(𡞰)文字を試してください。:)
502_Geek 2018年

2
@MojtabaRezaeianパスワードアルゴリズムに多少依存します-bcrypt2はASCIIを生成します。
Jasen

60

utf8mb4最近は、我々は言語の文字だけでなく、記号、新たに導入された絵文字などだけでなく、を格納するために支える必要があるため、文字セットが便利です。

Mathias Bynensによる「MySQLデータベースで完全なUnicodeをサポートする方法」を読むと、この点に光を当てることができます


11
MySQL 8.0はデフォルトでutf8mb4文字セットになりました。[ mysql.com/products/enterprise/techspec.html]
Ahmed Rezk 2018年

47

MySQL 8.0リファレンスマニュアルからの引用

  • utf8mb4:文字ごとに1から4バイトを使用するUnicode文字セットのUTF-8エンコード。

  • utf8mb3:文字あたり1〜3バイトを使用するUnicode文字セットのUTF-8エンコーディング。

MySQLの utf8現在のエイリアスでutf8mb3いる推奨されていませんし、将来のでは削除されますMySQLのリリース。その時点でutf8 への参照になり utf8mb4ます。

したがって、このエイリアスに関係なく、意識的にutf8mb4エンコードを設定できます。

答えを完成させるために、以下の@WilliamEntrikenのコメントを追加します(これもマニュアルから取得しています)。

の意味が曖昧にならないようにutf8、のutf8mb4代わりに文字セット参照を明示的に指定することを検討してくださいutf8

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.