Docker-Composeで立てたMySQL用コンテナの日本語設定の仕方


[前回書いた記事](https://qiita.com/maejima_f/items/34cf3b8eb5ffbe256ad9)では、laradock側のコンテナからMySQL側のコンテナに接続してDBを利用できる様にする様に設定しました。
ただ、MySQL側のコンテナを作成・起動した段階では日本語設定がされておらず、マイグレーションなどを日本語のデータを挿入しても文字化けしてしまいます。
という訳で、今回はMySQL側コンテナの日本語設定の方法をまとめます。
コンテナ上のOSとMySQL両方の日本語設定を行います。

******************************************************************
2019年5月8日追記
タグの変更
「Laravel5.6」⇨「Laravel」
******************************************************************
2019年5月1日追記

・誤字の修正
localeの設定にて「275. ja_JP.EUC-JP EUC-JP」と記載していた箇所は正しくは「276. ja_JP.UTF-8 UTF-8」です。
また、現在は「278. ja_JP.UTF-8 UTF-8」となっています。

******************************************************************


# 動作環境について
OS:macOS Sierra
version: 10.12.6

Docker(Engine):17.12.0-ce
Compose:1.18.0


# 参考資料
[Docker: コンテナのlocaleを設定したい](https://qiita.com/suin/items/856bf782d0d295352e51)
[Dockerコンテナで文字化けが発生した場合の直し方](http://yatta47.hateblo.jp/entry/2016/10/15/114701)
[.inputrc - teratermで日本語入力が出来ない場合](http://www.ksknet.net/freebsd/inputrc_terater.html)
[DebianでMySQL使う時に日本語入力したい](https://qiita.com/TakamasaIkeda/items/15a44bb6b5256de00d27)


# 実施方法
まず文字コードの確認を行い現状の把握をします。

```
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
```


「character_set_client」はクライアント側で発行したSQL文の文字コードを指定しています。
他にも本来「utf8」になっていて欲しいところが「latin1」になっています。

この状態のままでは、例えば日本語のデータが含まれたテーブルを除いてみると下記の通りになります。

```
mysql> select * from goods;
+----+---------+--------+-------+--------------------------------------+
| id | name    | genre  | price | comment                              |
+----+---------+--------+-------+--------------------------------------+
|  1 | ??????? | ????   |  1000 | ?????????????????????????            |
|  2 | ???     | ??     |  3000 | ???????????????????????????????????? |
|  3 | ??????  | ???    |   500 | ?????????????????????????            |
|  4 | ?????   | ???    |   300 | ???????????                          |
|  5 | ???     | ??     |  7000 | ?????????                            |
|  6 | ??      | ??     |  5000 | ???????                              |
|  7 | ???     | ??     |  2000 | ????                                 |
|  8 | ??DVD   | DVD?BD |  6000 | DVD????                              |
+----+---------+--------+-------+--------------------------------------+
8 rows in set (0.00 sec)
```

日本語は「?」と表示されています。
このデータはもともとLaravel側コンテナからマイグレーションしてきたものなのですが、外部から挿入されてきたデータだけでなくvimやコマンドライン上でも日本語が打てない状況なのでまずはそこの解決から行います。


まずlocale設定を調べてみると、LANGなどが設定されていないことがわかります。
他にも「POSIX」と言う値が入っております。

```
root@029515d3cc05:/# locale 
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
```



日本語設定の為に日本語のlocaleを追加します。

```
root@029515d3cc05:/# apt-get install locales locales-all
Reading package lists... Done
Building dependency tree       
Reading state information... Done
```


次に下記コマンドを実行すると番号とlocaleが一覧になって表示され、希望するlocaleの番号を入力する様に求められます。

```
root@029515d3cc05:/# dpkg-reconfigure locales
```

設定したいlocaleはこれです。

```
278. ja_JP.UTF-8 UTF-8
```


下記のメッセージとlocaleの一覧が出力されたら、番号の「278」を入力して「enter」を押すことで先に進めます。

```
Please choose which locales to generate. 278

(Enter the items you want to select, separated by spaces.)
Locales to be generated: ja_JP.UTF-8
```


次にデフォルトの言語を設定します。
ここでは、下記の通り「3」を入力して「enter」を押して先に進めます。

```
This will select the default language for the entire system. If this system is a
multi-user system where not all users are able to speak the default language, 
they will experience difficulties.

  1. None  2. C.UTF-8  3. ja_JP.UTF-8

Default locale for the system environment: 3


locales-all installed, skipping locales generation
```


次にタイムゾーンの設定を行います。
下記のコマンドでもコマンド実行中に任意の値を入力することになります。
「Asia」、「Tokyo」に該当する数字を入力してください。
下記コマンドで「Asia」「Tokyo」を選択します。

```
root@029515d3cc05:/# dpkg-reconfigure tzdata
debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)
debconf: falling back to frontend: Readline
Configuring tzdata
------------------

Please select the geographic area in which you live. Subsequent configuration 
questions will narrow this down by presenting a list of cities, representing the
time zones in which they are located.

  1. Africa        6. Asia            11. System V timezones
  2. America       7. Atlantic Ocean  12. US
  3. Antarctica    8. Europe          13. None of the above
  4. Australia     9. Indian Ocean
  5. Arctic Ocean  10. Pacific Ocean

Geographic area: 6


Please select the city or region corresponding to your time zone.

  1. Aden         24. Dubai             47. Kuching       70. Singapore
  2. Almaty       25. Dushanbe          48. Kuwait        71. Srednekolymsk
  3. Amman        26. Famagusta         49. Macau         72. Taipei
  4. Anadyr       27. Gaza              50. Magadan       73. Tashkent
  5. Aqtau        28. Harbin            51. Makassar      74. Tbilisi
  6. Aqtobe       29. Hebron            52. Manila        75. Tehran
  7. Ashgabat     30. Ho Chi Minh City  53. Muscat        76. Tel Aviv
  8. Atyrau       31. Hong Kong         54. Nicosia       77. Thimphu
  9. Baghdad      32. Hovd              55. Novokuznetsk  78. Tokyo
  10. Bahrain     33. Irkutsk           56. Novosibirsk   79. Tomsk
  11. Baku        34. Istanbul          57. Omsk          80. Ujung Pandang
  12. Bangkok     35. Jakarta           58. Oral          81. Ulaanbaatar
  13. Barnaul     36. Jayapura          59. Phnom Penh    82. Urumqi
  14. Beirut      37. Jerusalem         60. Pontianak     83. Ust-Nera
  15. Bishkek     38. Kabul             61. Pyongyang     84. Vientiane
  16. Brunei      39. Kamchatka         62. Qatar         85. Vladivostok
  17. Chita       40. Karachi           63. Qyzylorda     86. Yakutsk
  18. Choibalsan  41. Kashgar           64. Rangoon       87. Yangon
  19. Chongqing   42. Katmandu          65. Riyadh        88. Yekaterinburg
  20. Colombo     43. Khandyga          66. Sakhalin      89. Yerevan
  21. Damascus    44. Kolkata           67. Samarkand
  22. Dhaka       45. Krasnoyarsk       68. Seoul
  23. Dili        46. Kuala Lumpur      69. Shanghai

Time zone: 78



Current default time zone: 'Asia/Tokyo'
Local time is now:      Sat Apr 21 21:02:48 JST 2018.
Universal Time is now:  Sat Apr 21 12:02:48 UTC 2018.
```


LANGの環境変数を設定します。「ja_JP.UTF-8」で設定してください。
~/.bashrcにも同様の記述をしておきましょう。

```
root@029515d3cc05:/# export LANG=ja_JP.UTF-8
root@029515d3cc05:/# vim ~/.bashrc
```

localeを再度確認してみましょう。

```
root@029515d3cc05:/# locale
LANG=ja_JP.UTF-8
LANGUAGE=
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
```

localeの設定が出来ていることが確認出来ました。
これでvim上でなら文字化けせずに日本語が打てる様になります。


「inputrc」と言うファイルの設定を行います。
下記の3行を書いて即時に反映させてください。

```
root@029515d3cc05:/# vim ~/.inputrc
set convert-meta off
set meta-flag on
set output-meta on
root@029515d3cc05:/# source ~/.inputrc
```

これで再度MySQLの文字コードを確認してます。

```
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
```

⇨文字コードが変更されています!!


DBのデータも見てみましょう。

```
mysql> select * from goods;
+----+-----------------------+--------------+-------+--------------------------------------------------------------------------------------------------------------+
| id | name                  | genre        | price | comment                                                                                                      |
+----+-----------------------+--------------+-------+--------------------------------------------------------------------------------------------------------------+
|  1 | サッカーボール        | スポーツ     |  1000 | 柔らかい素材で出来ており、子供向けの遊び道具です。                                                           |
|  2 | 料理本                | 書籍         |  3000 | 各家庭で出されているレシピが掲載されています。夕飯の献立に困ったらぜひ。                                     |
|  3 | チョコレート          | お菓子       |   500 | ボリューミーでお腹いっぱいになることは間違いなし。                                                           |
|  4 | キャラメル            | お菓子       |   300 | 疲れた時にはこの１粒。                                                                                       |
|  5 | ブーツ                | 衣服         |  7000 | 着心地が良いです。                                                                                           |
|  6 | 帽子                  | 衣服         |  5000 | サイズ変更可。                                                                                               |
|  7 | 日本酒                | お酒         |  2000 | 度数高め                                                                                                     |
|  8 | 邦画DVD               | DVD・BD      |  6000 | DVD特典付き                                                                                                  |
+----+-----------------------+--------------+-------+--------------------------------------------------------------------------------------------------------------+
8 rows in set (0.00 sec)
```

日本語が正しく反映されていますね!。

今回の記事は以上です。

エンコードを指定せずにDBを作ると面倒くさいらしいので
DBを作る際はエンコードを下記の通り指定することが不可欠ですね。

```
create database データベース名 charset=utf8;
```