【備忘録】Dockerコンテナ内のMySQLが文字化けしたので修正した


## 概要
#### dockerでLaravel + MySQLの環境を立ち上げ、Seederでダミーデータを入れたところ、MySQL内の日本語が文字化けしてしまった。

## 環境
Mac Catalina 10.15.6
Laravel 6.2
MySQL 5.7


## データベース内の文字化け

```
mysql> select * from application_name.table_name;

|  1 | ???? ??      |                 189 | 8498212  ?????????????7-1-2             | 03-8883-3668   | 2021-07-15 10:09:24 | 2021-07-15 10:09:24 | NULL       |
|  2 | ???? ??      |                 360 | 3453918  ?????????????9-5-5 ?????106?   | 0300-424-932   | 2021-07-15 10:09:24 | 2021-07-15 10:09:24 | NULL       |
|  3 | ???? ??      |                 528 | 4957981  ?????????????9-1-6             | 001-886-2654   | 2021-07-15 10:09:24 | 2021-07-15 10:09:24 | NULL       |
|  4 | ???? ??      |                 233 | 5904105  ?????????????5-7-2 ?????102?   | 08587-5-2715   | 2021-07-15 10:09:24 | 2021-07-15 10:09:24 | NULL       |
|  5 | ???? ??      |                 573 | 9824086  ??????????????5-5-7            | 080-7012-9456  | 2021-07-15 10:09:24 | 2021-07-15 10:09:24 | NULL       |
|  6 | ???? ??      |                 172 | 5334151  ??????????????2-10-3 ?????101? | 05-7670-0650   | 2021-07-15 10:09:24 | 2021-07-15 10:09:24 | NULL       |
|  7 | ???? ??      |                 350 | 1262997  ?????????????3-2-6             | 080-7671-1836  | 2021-07-15 10:09:24 | 2021-07-15 10:09:24 | NULL       |
|  8 | ???? ??      |                 412 | 5197548  ?????????????10-9-10 ?????109? | 02270-4-1493   | 2021-07-15 10:09:24 | 2021-07-15 10:09:24 | NULL       |
|  9 | ???? ??      |                 583 | 4975073  ???????????????4-1-10          | 0231-75-8729   | 2021-07-15 10:09:24 | 2021-07-15 10:09:24 | NULL       |
| 10 | ???? ??      |                 124 | 4962559  ?????????????4-8-6 ?????109?   | 09095-8-3889   | 2021-07-15 10:09:24 | 2021-07-15 10:09:24 | NULL       |
+----+--------------+---------------------+-----------------------------------------+----------------+---------------------+---------------------+------------+
```

## 文字コードを確認

DBコンテナ内に入り、MySQLを起動し文字コードを確認してみる。

```
// DBコンテナに入る
$ docker-compose exec db bash

// MySQLへログイン
# mysql -u root -p
```

```
// 文字コードを確認
mysql> show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.11 sec)
```

【参考記事】
[MySQL 文字コード確認](https://qiita.com/yukiyoshimura/items/d44a98021608c8f8a52a)

#### うーん.....

やはり文字コードが<b>utf-8mb4</b>になっていないのが原因のようだが.........
<b>latin1</b>の箇所を変更すれば文字化けが解消されるのだろうか.........

### そんな時に良い記事を見つけたのでこちらを確認！

こちらによると..........

* character_set_database

> デフォルトデータベースで使用される文字セット。デフォルトのデータベースが変更されるたびに、サーバーはこの変数を設定します。デフォルトデータベースが存在しない場合、変数は character_set_server と同じ値になります。

* character_set_server

> サーバーのデフォルト文字セット。

#### とのこと！

どうやらデフォルトで使用されている文字セットの上記二つを`utf-8mb4`に変更してあげれば良さそう！

<b>というわけで早速変更！</b>

【参考記事】
[character_set_databaseとcharacter_set_serverの違いを知りたくて](https://qiita.com/mochizukikotaro/items/04d8d4b84a6d7353fddf)

## my.cnf作成
変更にはMySQLの設定ファイルである`my.cnf`を以下のように編集してあげれば良い！

```my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
explicit-defaults-for-timestamp=1
general-log=1
general-log-file=/var/log/mysql/mysqld.log

[client]
default-character-set=utf8mb4
```


今回は作成したLaravelアプリケーション、`docker-compose.yml`、`Dockerfile`と同階層に`my.cnf`を作成して、docker volumeでマウントする。


```docker-compose.yml
services:
  app:
    build: .

    ~~~~~ 省略　~~~~~~

  db:
    image: mysql:5.7
    restart: always
    ports:
      - 3333:3306
    environment:
      MYSQL_DATABASE: application
      MYSQL_ROOT_PASSWORD: hoge
      MYSQL_USER: hoge
      MYSQL_PASSWORD: hoge
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    volumes:
      - db:/var/lib/mysql
      ~~~~~~~ 以下のコードを追記 ~~~~~~~~~~~~
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
volumes:
  db:
```

## 文字コードが変更されたか確認！
再度dockerコンテナを立ち上げて、DBコンテナ内でMySQLの文字コードを確認してみる。

```
$ docker-compose up -d
```

####  一度コンテナを削除していたので、マイグレーションを行い、ダミーデータを入れ直します。


:::note 
以下コマンドでマイグレーションとダミーデータ追加を一回でやってくれる。
:::

```
$ docker-compose exec app php artisan migrate:fresh --seed

~~~ 省略 ~~~
Database seeding completed successfully.
```

#### いよいよDBコンテナ内へ！

```
$ docker-compose exec db bash

# mysql -u root -p
```

#### 文字コードを確認！

```
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+

```

#### おお〜！ 
##### ちゃんとと`utf8mb4`に変わっているご様子

<b>それでは本題のダミーデータを確認してみましょう！<b>


```
mysql> select * from application_name.table_name;
-------------------------------------------------+----------------+---------------------+---------------------+------------+
|  1 | 有限会社 喜嶋       |                 471 | 4061012  福岡県宮沢市中央区近藤町原田8-4-6 コーポ工藤109号                      | 080-5310-7389  | 2021-07-15 14:18:46 | 2021-07-15 14:18:46 | NULL       |
|  2 | 有限会社 津田       |                 543 | 2715124  岐阜県渚市東区中島町中津川7-7-7                                        | 080-4380-1497  | 2021-07-15 14:18:46 | 2021-07-15 14:18:46 | NULL       |
|  3 | 株式会社 廣川       |                 537 | 1087759  山梨県山岸市東区宇野町吉本5-10-10 ハイツ浜田107号                      | 04971-9-0972   | 2021-07-15 14:18:46 | 2021-07-15 14:18:46 | NULL       |
|  4 | 株式会社 近藤       |                 149 | 8558751  千葉県桐山市西区大垣町吉田6-2-3 ハイツ井高106号                        | 0339-07-6190   | 2021-07-15 14:18:46 | 2021-07-15 14:18:46 | NULL       |
|  5 | 有限会社 野村       |                 504 | 7198532  神奈川県廣川市南区近藤町大垣5-10-5 ハイツ青田104号                     | 0572-00-1782   | 2021-07-15 14:18:46 | 2021-07-15 14:18:46 | NULL       |
|  6 | 有限会社 渚         |                 503 | 5914279  岐阜県田辺市南区吉田町小林2-10-6                                       | 090-8228-1646  | 2021-07-15 14:18:46 | 2021-07-15 14:18:46 | NULL       |
|  7 | 有限会社 山口       |                 255 | 6956000  石川県山岸市西区近藤町笹田6-7-10 ハイツ山本110号                       | 07-6121-7627   | 2021-07-15 14:18:46 | 2021-07-15 14:18:46 | NULL       |
|  8 | 株式会社 佐藤       |                 126 | 7371679  広島県青田市東区笹田町加藤6-7-2                                        | 0480-028-690   | 2021-07-15 14:18:46 | 2021-07-15 14:18:46 | NULL       |
|  9 | 有限会社 山田       |                 290 | 5262206  栃木県田中市北区山田町三宅6-3-8 ハイツ中津川102号                      | 080-8499-9967  | 2021-07-15 14:18:46 | 2021-07-15 14:18:46 | NULL       |
| 10 | 有限会社 松本       |                 263 | 6373494  神奈川県加藤市中央区木村町山本8-5-3                                    | 030-808-2404   | 2021-07-15 14:18:46 | 2021-07-15 14:18:46 | NULL       |
+----+---------------------+---------------------+---------------------------------------------------------------------------------+----------------+---------------------+---------------------+------------+
10 rows in set (0.01 sec)
```

### できた！！！
#### 文字化けを直すことができました！！

## 感想

すぐ解決できると思っていたら意外にも時間がかかってしまったので、反省....
dockerやMySQLへの理解が不足していると感じる今日この頃でございました。

まだまだ基礎的なところで足下をすくわれることが多々あるので、まだまだ勉強が必要です。