Laradockで簡単アプリ作成しようとしたら、速攻でDB周り／日本語問題で躓いたけど、チャチャッと解決

環境セットアップが完了した

 - [Laradock on macでLaravelの開発環境をサクッと整備 - Qiita](http://qiita.com/yamazaki/items/d8b583a0fee70cadfc7b)

ので、まずは、シンプルなCRUDなアプリを作って、お試しぃ〜、と思い、以下を参考に

 - [Laravel5.4でシンプルなCMSを作るチュートリアル | webOpixel](http://www.webopixel.net/php/1259.html)

作業を始めて、速攻で躓いた...

標準のユーザー認証を利用しようと、`php artisan make:auth`して、DBへの反映で`php artisan migrate`したところ、以下のようなエラーで先に進めない

```
[Illuminate\Database\QueryException]                                                                     
SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laradock and table_name = migrations) 

[PDOException]                             
SQLSTATE[HY000] [2002] Connection refused
```

Laradockの初回起動後に、DB関連の設定を変更したことを思い出したので、`--build`オプションをつけて再実行

`docker-compose up --build -d nginx mysql`

でも、同様のエラーが発生するので、DBが想定通りに作成されているかを確認

```bash
# docker-compose upして、mysqlのインスタンスに入る
docker-compose exec mysql bash

# mysqlの対象のDBに入れれば想定通り
mysql -u laradock -p laradock

mysql> show tables;
Empty set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laradock           |
+--------------------+
2 rows in set (0.01 sec)

mysql> exit
Bye
```

ということで、Laradock側は問題なさそう

色々検索していると、Dockerのサービス間は、サービス名でリンクしているとのこと

> docker-compose.ymlの1行目でversion指定をしてますが、version2ですと、docker-compose.ymlに記述した全てのサービス間に自動的にリンクを張ってくれるようです(version1ではlinksを利用していた)。「ping サービス名」で自動的にリンクが貼られていることを確認できます。
> [Laravel : laradockでlaravelの開発環境構築 | DN-Web64](http://www.dn-web64.com/archives/web/laradock_laravel/)

この辺り、まだ、Dockerの仕組みを把握していないのが問題...
原因はわかったので、Laravel側の以下の設定を変更して、無事解決

```bash:$LARAVEL_ROOT/.env
#DB_HOST=127.0.0.1
DB_HOST=mysql
```

以下のあたりも参照しました。

 - [Trouble with MySQL connection #178](https://github.com/laradock/laradock/issues/178)

で、今度は、Seederで日本語をinsertした時に、文字化けが発生

```
mysql> select * from posts;
+----+--------+----------------+---------------------+---------------------+
| id | title  | body           | created_at          | updated_at          |
+----+--------+----------------+---------------------+---------------------+
|  1 | ?????  | ?????????????  | 2017-07-07 20:23:00 | 2017-07-07 20:23:00 |
|  2 | ?????? | ?????????????? | 2017-07-07 20:24:00 | 2017-07-07 20:24:00 |
+----+--------+----------------+---------------------+---------------------+
2 rows in set (0.00 sec)
```

以下のあたりで情報収集

 - [MYSQL 文字コード確認 - Qiita](http://qiita.com/yukiyoshimura/items/d44a98021608c8f8a52a)
 - [mysqlで文字コードをutf8にセットする - Qiita](http://qiita.com/YusukeHigaki/items/2cab311d2a559a543e3a)
 - [[Laravel] Laravelのhomestead環境で、MySQLデータベースの文字コードを修正する](https://agatayoshimi.blogspot.jp/2015/02/laravelhomesteadmysql.html)
 - [MySQLの文字コードをutf8mb4に変更 - Qiita](http://qiita.com/deco/items/bfa125ae45c16811536a)
 - [MySQL の文字エンコーディングを utf8mb4 にあとから変更する - ハトネコエ Web がくしゅうちょう](http://nekonenene.hatenablog.com/entry/2016/08/02/125424)
 - [MySQL(InnoDB) で charset を utf8mb4 にする注意点の現在 - Qiita](http://qiita.com/seizans/items/b0e81c44e2b6909a2b32)

まずは、MySQLに乗り込んで`show variables like '%char%';`してみると、結果は、以下のようになっていた。

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

Laradock側の設定が足りないと思われるので、my.cnfの配置箇所を探して、設定変更

```$LARADOCK_ROOT/mysql/my.cnf
[mysqld]
skip-character-set-client-handshake
character-set-server = utf8mb4
# collation-server = utf8mb4_general_ci
collation-server = utf8mb4_unicode_ci
init-connect = SET NAMES utf8mb4

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

Laravel側については、どんな処理されているのか、念のためチェックしたところ、`config/database.php`で以下のように記載があった。

```config/database.php
'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'strict' => true,
    'engine' => null,
],
```

collationについては、どう検索でヒットさせたいのか、という要件によるので、それに合わせて適宜設定すべし。

で、Laradockに関しては、上述の設定をした後に、再度、`--build`オプションをつけて、dockerを起動して見たところ、作成済みのDBはそのままだったので、対象DBのみ文字コードの変更は適用されず、以前のまま残っていた

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

既存DBの文字コードは、個別にALTRE文を流して、変更

```
mysql> ALTER DATABASE laradock CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 1 row affected (0.01 sec)

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/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

mysql> select * from posts;
+----+--------------------+--------------------------------------------+---------------------+---------------------+
| id | title              | body                                       | created_at          | updated_at          |
+----+--------------------+--------------------------------------------+---------------------+---------------------+
|  1 | 最初の記事         | 最初の記事のテキストです。                 | 2017-07-07 20:23:00 | 2017-07-07 20:23:00 |
|  2 | 二つ目の記事       | 二つ目の記事のテキストです。               | 2017-07-07 20:24:00 | 2017-07-07 20:24:00 |
+----+--------------------+--------------------------------------------+---------------------+---------------------+
2 rows in set (0.00 sec)
```

ということで、日本語を扱う場合は、いくつか、設定変更しないと正常に扱えないので、要注意！