こんにちは、なかにしです。
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!!