Tambourine作業メモ

主にスキル習得のためにやった作業のメモ。他人には基本的に無用のものです。

[Ruby]SequelでDBから読み出した文字列のエンコード

日本語の文字列をDBに書き込んで再度読み出すと、最初の文字列とは比較してもtrueにならない。表示しても文字化けしているようには見えない。

# coding: windows-31j
require 'sequel'

db = Sequel.odbc("MSDB", :user=>'hoge', :password=>'fuga', :db_type => "mssql")
db.identifier_input_method = nil

s1 = "ほげ"

db[:user].where(uid: 1).update(username: s1)

s2 = db[:user][uid: 1][:username]

puts s1 # => ほげ
puts s2 # => ほげ 
p s1 == s2 # => false

相当悩んだ。お互いをuppack(H*)して比較してみたりとか。いろいろやって読み出したらエンコードが変わっていることに気がついた。

"sequel エンコード"でググってみれば、以下にすぐたどり着く。

http://d.hatena.ne.jp/shibason/20100304/1267697379

おおぅ・・・まじか。

s1 = "ほげ"

db[:user].where(uid: 1).update(username: s1)

s2 = db[:user][uid: 1][:username].force_encoding("Windows-31J")

puts s1 # => ほげ
puts s2 # => ほげ
p s1 == s2 # => true

いや、これはないだろう。絶対に忘れる。

s1 = "ほげ"

db[:user].where(uid: 1).update(username: s1)

class User < Sequel::Model(:user)
  plugin :force_encoding, "Windows-31J"
end

s2 = User[uid: 1][:username]

puts s1 # => ほげ
puts s2 # => ほげ
p s1 == s2 # => true

うーん、これで我慢するしかないのか。正直、使いたくなくなった