内容へ移動
Mako Wiki
ユーザ用ツール
ログイン
サイト用ツール
検索
ツール
文書の表示
以前のリビジョン
バックリンク
最近の変更
メディアマネージャー
サイトマップ
ログイン
>
最近の変更
メディアマネージャー
サイトマップ
トレース:
ja:oracle:thinドライバのサイズ制限
この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。
====== OracleのThinドライバによるデータ・サイズ制限について ====== <color red>**ずいぶん古い話なので、もはや参考にすらならないかもー。うははははー**</color>\\ 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()を使用する。\\ ===== サンプルコード ===== ==== 通常のコード ==== <code java> PreparedStatement pstm = null; pstm = con.preparedStatement("INSERT INTO HOGE VALUES (?, ?)"); pstm.setInt(1, 1); pstm.setString(2, "MAKOLOG"); </code> ==== setCharacterStream()のコード ==== <code java> 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()); </code> ただし、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
ja/oracle/thinドライバのサイズ制限.txt
· 最終更新: 2014/07/16 08:10 by
makoto
ページ用ツール
文書の表示
以前のリビジョン
バックリンク
文書の先頭へ