OTN Japan - 404 Error

こりゃまた,器用な制限事項を...


えーと,結論から言えばドライバ依存の問題なので,Oracle JDBC Thinドライバの10.1.0.4.0以上を使っていれば特に気にすることはない(試した限りにおいては,9.2.0以前のドライバを使うと,この現象が再現した)。


この現象ってのは,

  • UTF8以外の文字コードを使っているOracle DBのVARCHAR2のフィールドに対して,
  • 666文字以上の全角文字をPreparedStatemet#setString()やsetObject()で代入すると,
  • VARCHAR2の文字数制限(2000バイト)に引っかかる。

ってやつ。なに?この微妙に香ばしい不具合仕様。
しかもこれ,VARCHAR2に割り当てたバイト数がどうこう以前に「そもそもVARCHAR2に代入可能かどうか?」っつうチェックで弾いているっぽい。実際のとこ,VARCHAR2(10)みたいなフィールドに「あいうえお」ってピッタリ入るし。


なお,ドライバを変更できない場合の回避策は,setString()やsetObject()ではなくsetCharacterStream()を使うだそうだ。
VARCHAR2 に2000バイトをINSERTしてこける問題について