mysql2 アダプタなら、IDにBIGINTを使っても大丈夫。

諸事情でRailsActiveRecordで使ってるテーブルのidがbigintだったりして、心臓が止まるかと思いました。
使ってるシステムは「Rails3 + mysql2」で助かった、というお話。

rails bigint」でググるとでてくるんですが、Railsでidにbigintを使うと値が32ビットを超えたときに32ビット整数に丸められてしまうという問題があるわけです。

古いエントリですが、↓このへん。
http://d.hatena.ne.jp/troopergreen/20080409
http://d.hatena.ne.jp/ryu00026/20070320/1174412910

これはRails2時代の gem "mysql" アダプタで接続した場合の挙動です。
Rails3時代の今は、gem "mysql2" アダプタが標準で、これは上記の問題は克服されている模様。


アダプタのソースを見てみると、

"mysql"アダプタ(mysql-2.8.1\ext\mysql_api/mysql.c)

/*	insert_id()	*/
static VALUE insert_id(VALUE obj)
{
    return INT2NUM(mysql_insert_id(GetHandler(obj)));
}

"mysql2"アダプタ(mysql2-0.3.11\ext\mysql2\client.c)

static VALUE rb_mysql_client_last_id(VALUE self) {
  GET_CLIENT(self);
  REQUIRE_OPEN_DB(wrapper);
  return ULL2NUM(mysql_insert_id(wrapper->client));
}

となっていて、「INT2NUM」が「ULL2NUM」に置き換わってます。
(INT2NUMとかULL2NUMとかはrubyのビルド用のマクロみたい)

で、MySQL側の値も my_ulonglong を返してくるので安心。
http://dev.mysql.com/doc/refman/5.1/en/mysql-insert-id.html