====== 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