7月 132012
 
Pocket

  • JDBC APIではPreparedStatementインタフェースを用いてパラメタライズドクエリを実行する
  • OracleJDBCドライバではOraclePreparedStatementクラスを用いてパラメタライズドクエリを実行する
  • OraclePreparedStatementのsetStringメソッドおよびsetCharメソッドは空白埋めを行わない
  • OraclePreparedStatementのsetFixedCharメソッドは空白埋めを行う
  • JDBCのPreparedStatementインタフェースにはsetCharおよびsetFixedCharメソッドは定義されていない
    (これらはOracleのJDBC拡張機能を用いる事で実装できる)

要するに・・・

CHAR(5)型のCOL1列を持ったテーブルTABLE_Aに対して
[sql]SELECT * FROM TABLE_A WHERE COL1=?[/sql]
というSQLに比較文字列をバインドしてを発行する時、setString(1, "ABC")とするとCOL1='ABC'という比較がされ、確実に0件。
setString(1, "ABC ")としなければならない。

OracleParameterdStatement.setFixedChar(int, String)を使用することにより、空白埋め比較でバインドする事も出来るが、DBに依存したコードとなる。

ちなみにバインドをしないでリテラルで比較するとヒットする。
[sql]SELECT * FROM TABLE_A WHERE COL1=’ABC'[/sql]
これはOracleでは両辺にVARCHAR2型またはNVARCHAR2型が使用されている場合以外は、空白埋めで比較が行われるためである。

そもそも可変文字列の格納にCHAR型を使うのをやめればすむ話。。

参考:

 Leave a Reply