ユーザ用ツール

サイト用ツール


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