[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 メーリングリストの案内