Node.jsでMySQLに接続してセレクトした時の話。
MySQL側でBIGINTで定義していたカラムから情報を取得したときに上手く変数に値が入ってくれなくてハマりました。
console.log()で調べてみると中身が'9379140374103748913'だったのが'9379140374103700000'みたいな形で途中から0になっていました。
Javascriptではnumber型という型に整数は入りますが、10の15乗桁くらいまでしか表現出来ないらしいです。それが原因でこいう現象になったのかも。
参考: データ型 (JavaScript)
参考: JavaScript 型の解説 - Wikibooks
MySQLでキャスト変換してセレクトしてくることで解決
ということで、javascirptで処理する前にキャスト変換して文字列として取得してみます。(今回の実装はそれだけで問題回避出来たので)
例えば,hoge_idのカラムがBIGINT型だったとして、
元々のセレクト文は
select user_id, hoge_id from my_table where user_id = 1;
こんな感じです。
cast関数を使ってcharに変換します
select user_id, cast(hoge_id as char) from my_table where user_id = 1;
これでhoge_idの値を文字列で取得することが出来ました!
参考: MySQL :: MySQL 5.1 リファレンスマニュアル :: 11.8 キャスト関数と演算子
カラム名をもとのものに合わせる
↑の書き方だとcast(hoge_id as char)というカラムで取得してしまうので、asでhoge_idにエイリアスを組みます。
select user_id, cast(hoge_id as char) as hoge_id from my_table where user_id = 1;
参考: カラムに別名(AS句)
なんか勉強になりました。