ja:oracle:thinドライバのサイズ制限
OracleのThinドライバによるデータ・サイズ制限について
ずいぶん古い話なので、もはや参考にすらならないかもー。うははははー
OracleにJavaからJDBCドライバ経由でデータ登録を行う際、PreparedStatementインターフェースを使用してデータ登録を行うが、Oracleの文字コードがUS_ASCIIとLatin-1以外の場合(日本語なら全部だけど)、setBytes()とsetString()にはサイズ制限がかかる。
「Oracle9i JDBC開発者ガイドおよびリファレンス2」にはそれについてのトピックまで存在する。
ちなみに上限は2000バイト。
一見「全角1文字2バイト」とすれば、全角1000文字までは普通に入りそうなもんだが、実際は666文字までしか入らない。
これはJDBCドライバに値をバインドする際に、Javaの内部コードとしても用いられているUTF-8を基準としたバイト換算で、「日本語全角1文字3バイト」と換算されてしまう為。
667文字バインドすると、667×3=2001となり、2000バイトの制限を超えてしまう。
この制限を回避する為、666文字を超える文字列をバインドする場合は、setString()ではなく、setCharacterStream()を使用する。
サンプルコード
通常のコード
PreparedStatement pstm = null; pstm = con.preparedStatement("INSERT INTO HOGE VALUES (?, ?)"); pstm.setInt(1, 1); pstm.setString(2, "MAKOLOG");
setCharacterStream()のコード
PreparedStatement pstm = null; pstm = con.preparedStatement("INSERT INTO HOGE VALUES (?, ?)"); String data = "MAKOLOG"; StringReader reader = new StringReader(data); pstm.setInt(1, 1); pstm.setCharacterStream(2, reader, data.length());
ただし、JDBCドライバが古いと、setCharacterStream()に修正していても666文字までかバインド出来ない事があるので、JDBCドライバも新しいものを使うようにする事。
というか、10gあたりのJDBCドライバからは制限が緩和されてるみたいで、setCharacterStream()を使ったりしなくてもいけちゃったりする様子。ていうか行けたww
参考URL
ja/oracle/thinドライバのサイズ制限.txt · 最終更新: 2014/07/16 08:10 by makoto