😊

MySqlのエンコード変更

2022/02/02に公開

現状の文字コード状態を確認してみる

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/

参考資料

https://penpen-dev.com/blog/mysql-utf8-utf8mb4/

GitHubで編集を提案

Discussion