【MySQL】Mysql2::Error: Incorrect string value 【エラー】

　開発環境では問題なく行えていた`seedファイル`の読み込みですが、本番環境では`seedファイル`を読み込む際に、MySQLエラーが発生しました。その対応について記述します。

# 1. エラー発生状況とエラー内容

```:ターミナル(本番環境）
# seedファイルの読み込みコマンド
$ rails db:seed RAILS_ENV=production
# 発生したエラー
 ActiveRecord::StatementInvalid: Mysql2::Error: Incorrect string value: '\xE5\x8C\x97\xE6\xB5\xB7...' for column 'name' at row 1: INSERT INTO 'areas ('name') VALUES ('北海道')
```

# 2. 開発環境と本番環境の文字コードを確認

　まずは、ローカル環境を確認する

```sql:ローカル環境
-- mysqlにログイン後、データベース一覧を出力
mysql> SHOW databases;
-- 該当のdatabaseを確認後、databaseを選択
mysql> use applicable_database --[該当のデータベース名]
-- 文字コードを確認
mysql> show variables like '%char%';
+--------------------------+------------------------------+
| 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/mysql56/charsets/ |
+--------------------------+------------------------------+
```

　同様に、本番環境を確認すると

```sql:本番環境
mysql> show variables like '%char%';
+--------------------------+------------------------------+
| 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/mysql56/charsets/ |
+--------------------------+------------------------------+
```

　上記を比べると、`character_set_database`の`Value`が
　ローカル環境では、**utf8**
　本番環境では、**latin1**
　となっています。

　`latin-1`では日本語対応していないため、MySQLエラーが出ていたみたいですね。
　ためしに、本番環境のdatabaseを削除して、`utf-8`を指定して作り直してみました。

```sql:本番環境
-- mysqlにログイン後、データベース一覧を出力します
mysql> SHOW databases;
-- 該当のdatabaseを確認後、削除コマンドによりデータベースを削除します
mysql> drop database applicable_database --[該当のデータベース名]
-- 同様の名前でdatabaseを作成、ただしオプションで文字コードを指定する
mysql> create database book_reviews_production default character set utf8;
-- databaseの文字コードを確認する
mysql> show variables like '%char%';
+--------------------------+------------------------------+
| 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/mysql56/charsets/ |
+--------------------------+------------------------------+
```

　文字コードの変更できました。
　**この後のmigrationとseedの読み込みコマンドは問題なく行えました。**


# 3. 原因
　`database.yml`を確認してみると、`charset`の指定が抜けていました
　追記することで、Railsコマンドでdatabaseを作成した際にも、文字コードが変更されました。

```yml:database.yml
default: &default
  adapter: mysql2
  # ↓これ
  charset: utf8
  encoding: utf8
  pool: 5
  username: root
  password:
  socket: /tmp/mysql.sock
```

# 4. あとがき

　調べてみると、databaseを`drop`することなく文字コードの変更も行えるみたいです。
　重要なレコードがある場合は、そちらをご活用ください。