開発環境では問題なく行えていた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. 開発環境と本番環境の文字コードを確認
まずは、ローカル環境を確認する
ローカル環境
-- 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/ |
+--------------------------+------------------------------+
同様に、本番環境を確認すると
本番環境
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
を指定して作り直してみました。
本番環境
-- 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を作成した際にも、文字コードが変更されました。
database.yml
default: &default
adapter: mysql2
# ↓これ
charset: utf8
encoding: utf8
pool: 5
username: root
password:
socket: /tmp/mysql.sock
4. あとがき
調べてみると、databaseをdrop
することなく文字コードの変更も行えるみたいです。
重要なレコードがある場合は、そちらをご活用ください。