技術系

[MySQL]UTF-8の罠

技術系

こんにちは、なかにしです。
MySQLを使うにあたり、初知りのことがあったので紹介します。

経緯

Laravelで何かを作るとき、
phpMyAdminを使ってMySQLをいじいじするのですが、
気になったのがこの箇所。

これ、いつもなんとなーく設定していたのですが、
何が正解なんだろう?という疑問が湧いたのがきっかけです。

文字コードなのでUTF-8にしときゃいいだろーと思って
いつもutf8_general_ciを選んでたんですよ。

でもデフォルトでutf8mb4_general_ciになってるってことは
それが正解なんじゃね?と。

上記の疑問が湧いたので調べたところ、
「MySQLのUTF-8は一般的なUTF-8じゃない」という衝撃の事実が発覚しました。

MySQLのUTF-8とは

一般的なUTF-8は1~4バイトまで対応している文字コードです。
MySQLのUTF-8は1~3バイトまで対応している文字コードです。

え?足りなくね?
そうです。足りないんです。

MySQLのUTF-8MB4は1~4バイトまで対応してます。


結論、一般的なUTF-8 = MySQLのUTF-8MB4なんです。
一般的なUTF-8 ≠ MySQLのUTF-8です。

「1~3バイト」と「1~4バイト」の違いは、
文字に対応できる幅の広さになります。

例えば、1~3バイトではある種の顔文字(😂とか)に対応していません。
普通に不便です。

何使えばいいねん

デフォルトの「utf8mb4-general-ci」が最適解だと思います。
まぁ一般的なUTF-8ですしね…

前述しなかった「utf16」については日本語をメインで使う場合にメリットがありますが、
クラス名もDB名も普通は英語や数字で記述していくので、選択肢から外れます。

※ちなみに、MySQL公式が「今後UTF-8を一般的なUTF-8に変えたいと思ってる」と発言しています。
今後仕様が変わり、一般的な認識と同じものになるのを切に願ってます…

今回の参考文献はこちらです!

おわりに

今回は「UTF-8の罠」について紹介しました。

これは騙されてたな~
ちゃんと調べるって大事ですね。

今回はここまで!
Enjoy Hacking!!

タイトルとURLをコピーしました