そういうことだったんですね

いろいろ調べたり学んだりしたことを忘れないように書き連ねています

rails - Mysql2::Error: Incorrect string value


次のエラーがでた場合。

Mysql2::Error: Incorrect string value:

原因を調べる

おおむね、データベースの文字コードを確認する。
たいてい latin1 とかになっている。

$ mysql -uuser -p my_db
mysql > show create table posts; 
CREATE TABLE `posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `text` text,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

もしくは、rake db:strcture:dump を使ってsqlを作成するのもよい。
db/structure.sql に出力される。

$ rake db:structure:dump
$ less db/structure.sql

修正方法(1) - テーブルの文字コードをかえる

テーブル自体の文字コードをかえる。

mysql > alter table posts character set utf8;

フィールド(今回は title)の文字コードをかえる。

mysql > alter table posts modify title varchar(255) character set utf8;

修正方法(2) - データベース自体の文字コードをかえてデータベースを作りなおす

テスト用環境ならこちらのほうが手っ取り早い。

my.cnf を編集
[mysqld]
character-set-server=utf8
;default-character-set=utf8 # MySQL 5.5より前
サーバ再起動
# /sbin/service mysqld restart
データベースの再構築
$ rake db:drop
$ rake db:create
$ rake db:migrate