[pgsql-jp: 33821] Java JDBCにおけるFloat型のNaN値の扱いについて
bxcel
bxcel @ prophet.jp
2004年 8月 4日 (水) 22:30:04 JST
松本と申します。
JDBC経由にてFloat型へデータをINSERTする処理において
PreparedStatementを使用した場合、java.lang.Floatの値が
Float.NaNの場合にエラーとなってしまいました。
環境
Vine2.6 + postgres7.4.3 + pg74.214.jdbc3.jar
テーブル定義
test=# \d t1
テーブル "public.t1"
カラム | 型 | 修飾語
--------+------------------+--------
a | double precision |
再現用Javaのコード1
ps = connection.prepareStatement("INSERT INTO t1 VALUES(?);");
ps.setObject(1,new Float(Float.NaN));
実行されたSQL文
INSERT INTO t1 VALUES(NaN);
実行結果
ERROR: column "nan" does not exist
再現用Javaのコード2
ps.setFloat(1,Float.NaN);
実行結果
ERROR: column "nan" does not exist
psqlコマンドから実行してみた所、シングルクォートすると
うまく行きました。
test=# INSERT INTO t1 VALUES('NaN');
INSERT 17151 1
test=# select * from t1;
a
-----
NaN
(1 行)
Float.POSITIVE_INFINITYとFloat.NEGATIVE_INFINITY
も同様でした。それぞれ
INSERT INTO t1 VALUES(Infinity);
ERROR: column "infinity" does not exist
INSERT INTO t1 VALUES(-Infinity);
ERROR: column "infinity" does not exist
となってしまいました。
#もっとも解決したとしてもオーバーフローのようですが....
PreparedStatementの「?」を使用しなければ
いいのですが、float型で使用できないのも不便ですし、
「NaN」や「Infinity」「-Infinity」の時だけ
別に展開するのもあまり良い方法には思えません。
他に良い回避方法など何か情報ありましたら教えてください。
これとは似た別の問題ですが、「WHERE a = ?」というWHERE句にて
「ps.setObject(1,null)」とした場合「WHERE a = null」となって
しまい「WHERE a is null」にはならないので、期待した結果に
ならない問題と同様なんですかね。
#こちらはSQL文作る方で対処しなければなりませんが....
pgsql-jp メーリングリストの案内