Laravel sail MySQLで日本語が文字化けした

1.開発環境
---------------------------------
laravelSail 　バージョン11
WSL2 ubuntu Windows11
MySQL 8.0

2.事前確認
------------
Laravel sail環境にてMySQLで日本語が文字化けするとき文字コードを変更するためには、my.cnfファイルを作成する必要があります。

まずは、今の文字コードを確認しておきましょう。
```
mysql> SHOW VARIABLES LIKE 'character%';
```
```
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | latin1                         |
| character_set_connection | latin1                         |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | latin1                         |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.01 sec)
```
character_set_client                              |
character_set_connection 
character_set_results

 この3つをutf8mb4に変更していきます



3.dockerfileでSail環境を独自にカスタマイズできる
---------------------------------
Sailはdocker-composeを利用してDockerコンテナを起動し、開発環境を立ち上げています。
DockerコンテナはDockerfileによって開発環境の設定を変更することができます。

```
sail artisan sail:publish
```
sail:publishを実行するとアプリケーションルートにdockerというディレクトリが作られます。
Dockerディレクトリ内にあるDockerファイルをカスタマイズすることによって内容を反映することができます。

     docker/
        ├── 8.1/
        │   ├── Dockerfile
        │   ├── php.ini
        │   ├── start-container
        │   └── supevisord.conf
        ├── 8.2/
        │   ├── Dockerfile
        │   ├── php.ini
        │   ├── start-container
        │   └── supevisord.conf
        └── 8.3/
            ├── Dockerfile
            ├── php.ini
            ├── start-container
            └── supevisord.conf

4.my.confファイルの作成
------

docker-compose.ymlのservices.laravel.test.build.contextを見ると私の環境では./docker8.3となっていました。
```docker-compose.yml
services:
    laravel.test:
        build:
            context: ./docker/8.3
            dockerfile: Dockerfile
```
バージョンは各々の環境で読み替えてください。
今回はdocker/8.3ディレクトリにmy.cnfファイルを作成します。

```docker/8.3/my.cnf
services:
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin

[client]
default-character-set = utf8mb4
```
これをMySQLの設定ファイルとして、MySQLコンテナの/etc/に配置するようにdocker-compose.ymlに追記します。

```diff_php
    #省略
    mysql:
        image: 'mysql/mysql-server:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ROOT_HOST: '%'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 1
        volumes:
            - 'sail-mysql:/var/lib/mysql'
            - './docker/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
+            - './docker/8.3/my.cnf:/etc/my.cnf'
```
5.反映されているか確認
--------------------------
sail down でコンテナを停止、sail up -d　で再起動します。
MySQLコンテナに入ります。
```
sail mysql
```
```
mysql> SHOW VARIABLES LIKE 'character%';
```

```
+--------------------------+--------------------------------+
| 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     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
```
文字コードを変更することができました。