Rails+SQL Serverの文字コード対策
環境
Ruby | 1.8.7p302 |
Rails | 2.3.10 |
DB | SQL Server |
クライアント(ブラウザ) | UTF-8 |
DB | CP932 |
$KCODEとWIN32OLE
config/environment.rb に次のような設定をしたが、更新時にエラーになる。
$KCODE = "u" require "win32ole" WIN32OLE.codepage=WIN32OLE::CP_UTF8
エラーメッセージのコピペ
ODBC::Error: 37000 (105) [Microsoft][SQL Native Client][SQL Server]Unclosed quotation mark after the character string '�E�010年ももぁE��ぐ終わめE)'.: INSERT INTO [kamis] ([naiyou], [created_at], [updated_at], [odai]) VALUES(N'大晦日も仕事(;ω;)', '2010-12-30 21:50:58.594', '2010-12-30 21:50:58.594', N'2010年ももうすぐ終わり')
参考:
http://yugui.jp/articles/572
SQL Serverを使う - azuki note
参考にしたページでは上手いこといくらしい。。。
自分の環境ではエラーになっちゃうのは何故?
Modelのコールバックを使う
Model の コールバックで変換を行うことでエラーにならないようになった。
class Kami < ActiveRecord::Base def after_find self.odai = Iconv.conv("UTF-8", "CP932", self.odai) self.naiyou = Iconv.conv("UTF-8", "CP932", self.naiyou) end def before_save self.odai = Iconv.conv("CP932", "UTF-8", self.odai) if self.odai_changed? self.naiyou = Iconv.conv("CP932", "UTF-8", self.naiyou) if self.naiyou_changed? end end
参考:
Ruby on Rails - Tips - かえるの尻尾
ActiveRecord::Callbacks
http://blog.mizzy.org/articles/2005/12/30/learningRails06
after_initializeに関して - カノ エ ノ メモ - cucumberグループ
http://jror4883.rubyforge.org/svn/trunk/activerecord/lib/active_record/callbacks.rb