Oracle JDBC Driver 10で確認。
必ず空文字””が返される。
「JDBC 開発者ガイドおよびリファレンス」に載ってるらしい。
Each class variable, instance variable, or array component is initialized with a default value when it is created (§15.9, §15.10):
For type byte, the default value is zero, that is, the value of (byte)0.
For type short, the default value is zero, that is, the value of (short)0.
For type int, the default value is zero, that is, 0.
For type long, the default value is zero, that is, 0L.
- 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型を使うのをやめればすむ話。。
Connection.closeをしても、ResultSetとStatementはGCが動くまでメモリに確保されたまま-
Statement.closeで自動的にResultSet.closeは実行される - ResultSet (Java 2 Platform SE 5.0)
※憶測入り。特にデシリアライズの時の判断基準とか適当。
結論から言うと、普通は指定しなくて大丈夫。
シリアライズする必要性のあるクラスの場合、指定したほうが環境問題に悩まされずにすむのでベター。
serialVersionUIDとわ
端的にいえば、シリアライズされたオブジェクトを送る側と受け取る側で、どのクラスのインスタンスなのかを識別するためのID。
いろいろ
- どうやらクラス名とクラスメンバとserialVersionUID(以下SUID)で判別してるようだ。
- 送られてきたクラス定義とSUIDが、受け取る側が参照できるクラスと同じなら、互換性があるクラスだと判断して、オブジェクトをそのクラスを使用して解析するんだと思う。
- 定義とSUIDが同じだけど実は互換性がない(実装が違う)場合、変換時に例外が出る。
- 指定しないとSHA-1でクラスのハッシュから計算されるっぽい。
- SUID自動計算の方法は環境によって違うっぽいので自分で指定したほうがベター。
- Serializableインタフェースだと勝手に計算してくれる。
- Externalizableインタフェースだと自分で指定しないとだめぽい。
- Exceptionの場合、ThrowableインタフェースがSerializableインタフェースを実装してるので、SUIDが求められる。
おまけ
serialverコマンドでSUID自動計算の結果が見れる。
ざっと試した感じ、以下の情報できまるっぽい。
