MySQLのBIT型

RailsMySQL の BIT型が扱えることを確認した。


要は String で渡ってくる。


こんな SQLMySQL に食わせたときに、

DROP TABLE IF EXISTS `entries`;          
CREATE TABLE `entries` (                 
  `id` int(11) NOT NULL,                 
  `flags` bit(8) NOT NULL,               
  PRIMARY KEY  (`id`)                    
) ENGINE=ndbcluster DEFAULT CHARSET=sjis;

INSERT INTO entries VALUES(1, b'00000111');


Ruby の世界ではこうなる:

$ ./script/console
Loading development environment (Rails 2.1.0)
>> entry = Entry.find 1
=> #<Entry id: 1, flags: "\a">
>> entry.flags
=> "\a"
>> entry.flags.class
=> String
>> entry.flags.unpack("C8")[0]
=> 7
>> "%08b" % entry.flags.unpack("C8")[0]
=> "00000111"
>> entry.flags.unpack("B8")
=> "00000111"


フラグの上げ下げは、モデルでビット毎に専用のアクセサを用意した方がいいだろう。

class Entry < ActiveRecord::Base                              
  def up_read
    self.flags = (self.flags.unpack("C8")[0] | 0b00000100).chr
  end                                                         
                                                              
  def down_write
    self.flags = (self.flags.unpack("C8")[0] & 0b11111101).chr
  end                                                         
end                                                           

ちょっと長いな。つーか pack/unpack はよーわからんから困る。


ビット演算なんてひさかたぶりすぐる。