完全に覚え書きです。参考(というか答え)にさせて頂いたページはこちらです。感謝。
MySQLのLOAD DATA INFILEで大はまりした話 | infoScoop開発者ブログ
ハマってしまっているときに、こういうズバっと一直線な回答にたどり着くとうれしいものです。
完全に覚え書きです。参考(というか答え)にさせて頂いたページはこちらです。感謝。
MySQLのLOAD DATA INFILEで大はまりした話 | infoScoop開発者ブログ
ハマってしまっているときに、こういうズバっと一直線な回答にたどり着くとうれしいものです。
Twitter のツイートを MySQL に記録しようとした際に Ruby で mysql2 を用いようとしたのですが、どうあがいてもエラーで止まることがあります。Incorrect string value
とか出てきますが、MySQL に収める前の生取得データはちゃんと取れています。
したがって、MySQL へ格納する過程でエラーが出ていることになります。
となるとまあ十中八九は文字コードの問題でしょう。ここでは cnf ファイルの設定はutf8mb4_general_ci
になっているものとして話を進めます。cnf ファイルの設定についてはこちらのサイトやこちらのサイトをご参照ください。また、テーブル、カラムの文字コード設定も utf8mb4_general_ci に設定されているものとします。
さて、mysql2 で文字コードを utf8mb4_general_ci に指定するためには、オブジェクトの作成時に以下のオプションを指定してあげましょう。
:charset => 'utf8mb4' :encoding => 'utf8mb4' :collation => 'utf8mb4_general_ci'
具体的には以下のような感じで生成してあげればいいです。
client = Mysql2::Client.new(:host => 'HOSTNAME', :user => 'USERNAME', :password => 'PASSWORD', :database => 'DATABASE', :charset => 'utf8mb4', :encoding => 'utf8mb4', :collation => 'utf8mb4_general_ci')
これで INSERT すれば通るはずです。queryメソッドで発行するクエリ文字列は、SQL エラーが起きないように % や %Q でくくるのが良いかと思います。変数を用いる場合はダブルクォーテーションとシングルクォーテーションの違いに注意ですね。
ここらへんやっときましょう。
# apt-get install -y language-pack-ja-base language-pack-ja # update-locale LANG=ja_JP.UTF-8 LANGUAGE=ja_JP:ja # export LANG=ja_JP.UTF-8 # export LC_ALL=ja_JP.UTF-8 # export LC_CTYPE=ja_JP.UTF-8