Hatena::ブログ(Diary)

sadaharu28の日記

2010-12-31

Rails+SQL Serverの文字コード対策

| 07:25

環境

Ruby1.8.7p302
Rails2.3.10
DBSQL Server

文字コード

クライアント(ブラウザ)UTF-8
DBCP932
$KCODEとWIN32OLE

config/environment.rb に次のような設定をしたが、更新時にエラーになる。

$KCODE = "u"
require "win32ole"
WIN32OLE.codepage=WIN32OLE::CP_UTF8

f:id:sadaharu28:20101231065219p:image

f:id:sadaharu28:20101231065220p:image


エラーメッセージコピペ

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年ももうすぐ終わり')

参考:

Rails + SQLServerでクエリがシンタックスエラーな件 - 世界線航跡蔵

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

403 error - Forbidden

after_initializeに関して - カノ エ ノ メモ - cucumberグループ

no title

トラックバック - http://d.hatena.ne.jp/sadaharu28/20101231/1293747922