mysql2 アダプタなら、IDにBIGINTを使っても大丈夫。
諸事情でRailsのActiveRecordで使ってるテーブルの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