概要
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 文字コード確認
うーん.....
やはり文字コードがutf-8mb4になっていないのが原因のようだが.........
latin1の箇所を変更すれば文字化けが解消されるのだろうか.........
そんな時に良い記事を見つけたのでこちらを確認!
こちらによると..........
- character_set_database
デフォルトデータベースで使用される文字セット。デフォルトのデータベースが変更されるたびに、サーバーはこの変数を設定します。デフォルトデータベースが存在しない場合、変数は character_set_server と同じ値になります。
- character_set_server
サーバーのデフォルト文字セット。
とのこと!
どうやらデフォルトで使用されている文字セットの上記二つをutf-8mb4
に変更してあげれば良さそう!
というわけで早速変更!
【参考記事】
character_set_databaseとcharacter_set_serverの違いを知りたくて
my.cnf作成
変更にはMySQLの設定ファイルである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でマウントする。
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
一度コンテナを削除していたので、マイグレーションを行い、ダミーデータを入れ直します。
以下コマンドでマイグレーションとダミーデータ追加を一回でやってくれる。
$ 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
に変わっているご様子
それでは本題のダミーデータを確認してみましょう!
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への理解が不足していると感じる今日この頃でございました。
まだまだ基礎的なところで足下をすくわれることが多々あるので、まだまだ勉強が必要です。