それぞれ以下のように違います。
utf8
→ 1~3バイトまで対応utf8mb4
→ 1~4バイトまで対応
(なぜ2種類あるのかはMySQLの歴史によるものらしいのですが、私はいまいち分かっていないので詳しく知りたい方はググってみてください・・。)
保存できる文字の違い
これはつまり、UnicodeのコードポイントがU+FFFFを超える文字は、utf8
では保存できないってことです。
例えば
- 崎(U+5D0E)←保存できる
- 﨑(U+FA11)←保存できる
- 😀(U+1F600)←保存できない
- 𩸽(U+29E3D)←保存できない
※ちなみにこの漢字はホッケと読みます
みたいな感じ。
絵文字などを保存したい場合はutf8mb4
を使わないといけません。
MySQLのutf8はUTF-8ではないのでは・・?
UTF-8は「世界中の文字を1つの文字コードで表そうぜ!」な文字集合であるUnicodeを表すための文字符号化方式の1つなわけですが
本来UTF-8は、1~4バイトで文字を表すルールです。
なので、MySQLのutf8
はそもそもUTF-8とは呼べないわけです。
だって1~3バイトまでしか対応してないんだから。偽物ですよ偽物。
なので、はじめてこのルールを知ったとき
utf8って名前なのに3バイトしか対応してないのかよ!
てかutf8mb4が4バイト対応なんだったら、むしろutf8mb4が本物のUTF-8じゃねえか!名前変えろよおおおおお!!
と私は強く思ったのですが、そう思ったのは私だけではないはず・・。
まぁそんなわけで
今後MySQLを使ったアプリを作っていく場合は、utf8
ではなくてutf8mb4
を選択した方が良いと思われます・・。
仕様が変更される可能性あり
MySQLの公式を見てみると、以下のように書かれています。
MySQL の今後のバージョンでは、
utf8
が 4 バイトのutf8
になり、3 バイトのutf8
を指定するときにutf8mb3
を示す必要が生じる可能性があります。引用:https://dev.mysql.com/doc/refman/5.6/ja/charset-unicode-utf8mb3.html
utf8mb3
文字セットは非推奨であり、将来の MySQL リリースで削除される予定です。 かわりにutf8mb4
を使用してください。
utf8
は現在utf8mb3
のエイリアスですが、ある時点ではutf8
がutf8mb4
への参照になることが予想されます。utf8
の意味があいまいにならないように、utf8
ではなく文字セット参照にutf8mb4
を明示的に指定することを検討してください。引用:https://dev.mysql.com/doc/refman/8.0/ja/charset-unicode-utf8.html
なので、この謎仕様は変更されるかもしれません。(これが本来のあるべき形ですよね😑)
おわり
コメント