====== 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 =====
http://ameblo.jp/archive-redo-blog/entry-10035623455.html\\
http://www.t-doi.org/diary/?date=200504