制作開発部の野原です。
PandoではデータベースにMySQLの5.7系を利用しており、
絵文字や難しい漢字なども扱えるように、テーブルの文字コードはutf8mb4を設定しています。
みんな大好きなお寿司の絵文字 🍣 が表示できるのもこのおかげです。
今回は、utf8mb4のテーブルをMySql Workbenchで扱う際の注意点をお話しします。
utf8mb4とは
utf8mb4という文字コードはあまり聞きなじみがないと思いますが、
通常、MySQLで定義されているutf8は BMP (Basic Multilingual Plane) の範囲しか利用することができません。簡単に説明すると、文字の中でも一般的に利用するものを指します。
MySQLのBMPは3バイトしか保持できない仕様となっているため、4バイトを利用する範囲にある文字は格納できません。
この4バイトの範囲内にある絵文字や難しい感じなども扱えるようにするための文字コード設定が、utf8mb4となります。
※詳しくはMySQLのドキュメント参照
https://dev.mysql.com/doc/refman/5.6/ja/charset-unicode-utf8mb4.html
MySQLサーバー上の設定
MySQLでutf8mb4のデータを利用する際、my.cnfに下記のような設定を行います。
[mysqld]
character-set-server=utf8mb4
これはMySQLサーバを自前で運用する場合の設定ですが、AWSのRDSを使う場合はパラメータグループ内の該当する値を設定する等、利用している環境によって設定が必要です。
これで、文字コードをutf8mb4で作成したテーブルも正しくデータが格納できます。
MySQL Workbenchで確認すると.....
さて、utf8mb4で作成したテーブル内に入れたデータをMySQL Workbenchで確認してみると...
3行目のデータの末尾にお寿司の絵文字を入れているはずなのですが、?で文字化けしてしまっています。
なぜ文字化けしてしまうのか
Workbench上でMysqの文字コードに関する設定を確認してみます
show variables like '%character\_set\_%';
クライアント側の文字コードがutf8になってしまっているせいで、せっかくデータベースでutf8mb4で作成されているデータが読めない状態になってしまっています。
調べてみるとMySQL Workbenchの接続文字コードは、utf8で固定されており、utf8mb4に変更できない仕様になっているようです。
接続時の文字コードを指定しないといけないのは当たり前といえば当たり前ですが、まさか変更ができないとは思いませんでした。
文字化けしてしまって見えなくなるだけならまだよいのですが、
この状態で絵文字等が入ったカラムのデータを更新してしまうと、データが欠損してしまうため注意が必要です。
解決策は?
解決策をいろいろと探しましたが、結論から言ってベストなものは見つかりませんでした。
1. SET NAMES で文字コードを手動設定
Workbench上で、下記クエリを実行することで明示的に文字コードを設定することができます。
SET NAMES utf8mb4;
明示的にセットしたので当たり前ですが、接続文字コードはutf8mb4になります。
ですが、毎回このクエリを実行しなくてはいけないのでかなり面倒ですし、実行し忘れる恐れがあります。
2. MySQL Workbenchを捨てる
他のGUIツールではutf8mb4で接続してくれるものもあるようなので、乗り換えるのも手です。
しかし、MySQL Workbenchの独自機能であるVisualExplainはかなり捨てがたいのでできればこの選択肢は選びたくないです。。。
https://dev.mysql.com/doc/workbench/en/wb-tutorial-visual-explain-dbt3.html
まとめ
MySQLでutf8mb4のテーブルを扱う場合は、接続する際の設定にも注意が必要です。
最適な解決方法がなくとても残念ですが、Wworkbenchで接続文字コードが設定できるようになってくれることを願っています。
よい解決策があればぜひコメントお願いします。
※ちなみに、MySQLサーバのバージョンが8以上の場合、MySQL Workbench 8.0.12以降のバージョンだとutf8mb4で接続してくれるようです。
🍣表示できるの初めて知りました・・・!スマイリーも出た・・・!🤩
PCのキーボードから打つ時はどうやって絵文字出していますか?
絵文字サイトからコピペしていますが、面倒なのでPandoに絵文字エディタがあると嬉しいです。
PCからの場合は、意外に普通に変換するだけで表示される場合が多いです。
🍣も、「おすし」として変換すると最後のほうに「環境依存文字」として候補がでてきます。
絵文字エディタに関しては開発チームに要望として挙げておきます。🐸
なるほど😉ありがとうございます。