Railsのdelayed jobでMysql2::Error: Incorrect string valueが出た時の対処法

プログラミング、サーバー、ネットワーク、IT用語、ハマったときのトラブルシューティングなど様々なIT関連の話題をひたすら書いていく技術ブログです。

2017年2月2日木曜日

Railsのdelayed jobでMysql2::Error: Incorrect string valueが出た時の対処法


Ruby on Railsでdelayed jobというgemがあります。これを使うとある部分の処理をバックグラウンドで実行することができます。MySQLにdelayed_jobsというテーブルが作成されてキューを作成して時間が来たら、そのキューを実行します。

ここではdelayed jobを使用して遭遇したMysql2::Error: Incorrect string valueの問題に対処するための解決策を紹介します。

delayed_jobsテーブルのcharsetがCHARSET=latin1になっていた

そのまま何も考えずにrake db:migrateを行うとcharsetがlatin1になっていました。これは

show create table テーブル名;

で確認できます。latin1になっていたら

・テーブル自体の文字コード変更
alter table posts character set utf8;

・特定のカラムのみ文字コード変更
alter table posts modify カラム名 varchar(255) character set utf8;

のようにしてテーブルの文字コードを変更しましょう(上記はutf8の例です)。私はテーブル自体の文字コードを変更しました。これで解決できました。

データが長すぎてhandlerカラムに入らない問題

delayed_jobテーブルにhandlerというカラムがあるのですが、そこにはyamlでエンコードされた文字列がとてつもなく長い状態で入っているのですが、handlerのデータタイプがtextなので、更新したデータが長い場合、textでは対応できないことがありました。

これを解決するにはtextデータタイプをmediumtextかlongtextに変更します。migrationファイルを作成して下記のようにデータタイプを変えます。

change_column :delayed_jobs, :handler, :mediumtext, :null => false
change_column :delayed_jobs, :last_error, :mediumtext

handlerと一緒に念のためlast_errorカラムも変えます。このカラムはキューの実行でエラーが起きた時などにエラーの原因が入るようになっています。ストレージを増やすことにより解決しました。今回はmediumtextを使用しましたが、キューは実行されれば削除されていくので、longtextにしてもいいかもしれません。

◯Ruby on Railsの記事一覧はこちら
◯トラブルの解決方法の一覧はこちら



最近の投稿