前回書いた記事では、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を設定したい
Dockerコンテナで文字化けが発生した場合の直し方
.inputrc - teratermで日本語入力が出来ない場合
DebianでMySQL使う時に日本語入力したい
実施方法
まず文字コードの確認を行い現状の把握をします。
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 | 疲れた時にはこの1粒。 |
| 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;