😊
MySqlのエンコード変更
現状の文字コード状態を確認してみる
show variables like "chara%";
現在の状態はこうなっている模様。
Variable_name | Value |
---|---|
character_set_client | utf8mb4 |
character_set_connection | utf8mb4 |
character_set_database | latin1 |
character_set_filesystem | binary |
character_set_results | utf8mb4 |
character_set_server | latin1 |
character_set_system | utf8 |
character_sets_dir | /usr/share/mysql/charsets/ |
utf-8とutf8mb4の違いって?
結論から言うと、utf8mb4を使用していく方が良さそう。。
MySqlのutf8は1〜3バイトまでしか扱えないんですって。
Mysqlのバージョンを確認する
まずは、使用しているMySqlのバージョンを確認してみる。
select version();
→5.7.36
各設定の意味を確認
Variable_name | description |
---|---|
character_set_client | クライアントが送ってくるとサーバーが想定している文字コード |
character_set_connection | クエリを実行する文字コード |
character_set_database | 使っているデータベースの文字コード。変える必要はないしsetで変えてはいけない |
character_set_filesystem | ファイル名の文字コード。デフォルトでいい |
character_set_results | クライアントに結果を返すときの文字コード |
character_set_server | 新規にデータベースを作るときの文字コード。設定しておくと楽。いろいろ継承されるが上書きできる。 |
character_set_system | サーバーが識別子を格納するために使用する文字セット |
character_sets_dir | テーブル名とかを保存する文字コード。デフォルトでいい |
設定ファイル
下記の設定ファイル(my.cnf)を作成する。
[mysqld]
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4
docker-compose.yml
docker-compose.ymlのコンテナのvolumesにバインドする。
version: '3'
services:
db_data:
image: busybox
volumes:
- type: bind
source: "./db/conf.d/my.cnf"
target: "/etc/mysql/conf.d/my.cnf"
これでOKかと思ったら。。
すでに作成済みのテーブルについては、文字コードが変更してくれませんでした。
今回は勉強用のソースコードなので、コンテナを削除→再作成することで、DBを一から構築し直しました。
一度dropしてcreateしてしまえば問題なしでした。
最終的には下記のようになりました。
Variable_name | Value |
---|---|
character_set_client | utf8mb4 |
character_set_connection | utf8mb4 |
character_set_database | utf8mb4 |
character_set_filesystem | binary |
character_set_results | utf8mb4 |
character_set_server | utf8mb4 |
character_set_system | utf8 |
character_sets_dir | /usr/share/mysql/charsets/ |
参考資料
Discussion