[Oracle] JDBCでバインドできる文字列のサイズの制限 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

Java.sql.PreparedStatementインターフェースを使用してOracleデータベースにデータを登録する際、setString()メソッドを使用してバインドできる文字列のサイズには制限があるようです。


Oracleデータベースとしてのバインドサイズの上限はVARCHAR2、NVARCHAR2の最大サイズ(4000バイト)と同じなのですが、Oracle JDBCドライバでPreparedStatementインターフェースのsetString()メソッドを使用した場合、使用しているキャラクタ・セットによってより厳しいサイズ制限が課せられるようです。


「Oracle9i JDBC開発者ガイドおよびリファレンス2(9.2)」の中の「ThinドライバによるSQL CHAR データ・サイズ制限」というトピックで解説されている内容を見ると、データベース・キャラクタセットがJA16SJISの場合、2000バイト(UTF-8バイト)が上限となっています。


つまり、文字数で言うと日本語ばかりで666文字(UTF-8では日本語は3バイトで表される)が上限となるというわけです。


※なぜUTF-8が出てくるのかと言うと、Oracle JDBCドライバは、CHAR またはVARCHAR2 バインドのために、Java UTF-16キャラクタをUTF-8エンコーディング・バイトに変換し、次にUTF-8 エンコーディング・バイトはデータベースに転送され、データベースはUTF-8 エンコーディング・バイトをデータベース・キャラクタ・セット・エンコーディングに変換するという内部的な仕組みになっているためです。


この制限を超える文字列をsetString()によってバインドしようとした場合は

ORA-17070: データ・サイズがこの型の最大サイズを超えています。

というエラーが発生します。


このエラーを回避するためには、日本語で666文字を超えるような値をセットされる可能性のある文字列型の列に対しては、setString()ではなく、setCharacterStream()を使用して値をバインドする必要があります。


何とも不便な...




【関連エントリ】
[Oracle] JDBCでバインドできる文字列のサイズの制限 2004/12/09
[Oracle] バインドした文字列がすり替えられる??? 2004/12/28