[Laravel] Laravelのhomestead環境で、MySQLデータベースの文字コードを修正する

PHPの最近はやってきているというLaravelを動かすのに、Homesteadを入れてみたところ、そのまま使うとMySQLのデータが文字化け。
mysqlコマンドで確認してみると、文字コード周りの設定がされてないので、latin1になってしまっている。
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

問題点としては以下の2点。
  1. my.cnfにmysqldの文字コード設定がないのでデフォルトのlatin1になっている模様
  2. そのせいで、特に指定無く作成されているhomesteadデータベースもlatin1になっている。
Homesteadの方で設定できんのかなーと思ったけど、1の方は方法が見つけられなかったのでとりあえず仮想マシン上の設定を直接修正するしかなさそう。

ただこれだと後で環境再構築するときにまたまっさらになってしまうので、それはちょっっと面倒。起動時にスクリプトが走っているようなので、そのあたりに手を入れれば出来そうなんだけどなー。

2については最初にデータベースを作成しているところで設定できそうだったので試してみる。
ホームディレクトリの.composer/vendor/laravel/homestead/scripts/以下にhomesteadのスクリプトがある。
このうちMySQLのデータベースを作成しているのがcreate-mysql.sh。
このスクリプトでは特に文字コードを指定してない。
#!/usr/bin/env bash
DB=$1;
mysql -uhomestead -psecret -e "DROP DATABASE IF EXISTS $DB";
mysql -uhomestead -psecret -e "CREATE DATABASE $DB";
このうちCREATE DATABASEを実行している部分を以下のように修正。
mysql -uhomestead -psecret -e "CREATE DATABASE $DB DEFAULT CHARACTER SET utf8";
実験のため一度homestead destroyで環境を破棄。改めてhomestead upで起動する。
mysqlコマンドで作成されたデータベースの文字コードを確認。
$ mysql -uhomestead -psecret homestead -e "SHOW VARIABLES LIKE 'char%'";
Warning: Using a password on the command line interface can be insecure.
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
上記の通りデータベースについてはutf8に修正されている。

MySQLサーバーの設定については直接修正。
/etc/mysql/my.cnfの[mysqld]セクションに以下の記述を追加。
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8
その上でmysqldを再起動。
$ sudo service mysql restart
mysql stop/waiting
mysql start/running, process 2710
こちらもmysqlコマンドで文字コードを確認。
$ mysql -uhomestead -psecret -e "SHOW VARIABLES LIKE 'char%'";
Warning: Using a password on the command line interface can be insecure.
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
これでhomesteadデータベースとmysqldの設定の修正が完了。


コメント