VARCHAR2へ文字列をバインドするための対処法探しの旅

2008年09月06日 09:40

おしゃれ雑貨ブログです↓
http://viealamode.blog46.fc2.com/

Oracle JDBCドライバでPreparedStatementインターフェースのsetString()メソッドを使用した場合、使用しているキャラクタ・セットによってより厳しいサイズ制限が課せられる

ということだが
対処方を探してみた。

正直Javaに詳しくないので難しい・・・

「PreparedStatementインターフェースのsetString()メソッドを使用した場合」と言っていたが、setStringを使用しなければバインドできるというわけではない。

用はsetStringはString型で渡しているからINSERTすることができないんだと思う。

そこでsetCharacterStream()を使用すればバインドできるという話があったのだ。
これはString型でなくLONGVARCHAR型でデータを送る事ができるからだ。
こちらでおくれば無事INSERTできるという。

しかし、ここで問題点が、先日も話したが
setCharacterStream()で送ればINSERTできるの
しかし1つのテーブルにつきLONG型は1つしか存在してはいけないらしく
2つ以上大量データの領域があるカラムが存在すると
正常にバインドされないという。

→ただし情報が古いようなので、現在では大丈夫かも!?

なので大量データカラムが2つ以上あるテーブルでは気をつけて実装しましょう。






と、まあここまでは先日の復習。

実は、今回実装している部分ではsetCharacterStream()が使用できない実装方法で
これが使用できないことがわかりました。
しかしStringで渡しているのでこのままではバインドできない


■対処法1

そこでもうひとつバインド関数で用意されていたのを発見した
それは引数にInputStreamが指定されており
これはLONGVARBINARY型でデータを送るため、解決できるのではないかと思った。

InputStreamにはバイト型変数を指定しなければならないため


String st = 'じゃばってめんどくせっここに2001バイト以上4000バイト以内のデータをいれるんだよ';
InputStream is = st.getBytes();

こんな感じ?(ちょっと違うかもねw)

これをバインド関数の引数に渡して
データをバインドしてみた。

結果


4000バイトまでINSERTできました!!


しかーし


バイトでINSERTされましたw


やっぱりバイナリでVARCHARに送るとそのままバイトでINSERTされるみたいです。


しょぼーん。




web開発支援サイト作ってます
http://smileboys.fc2web.com/WebUtility/index.html

JDBC経由によるVARCHARへのINSERTの文字数制限

2008年09月05日 01:50

おしゃれ雑貨ブログです↓
http://viealamode.blog46.fc2.com/

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()を使用して値をバインドする必要があります。




まじやっかい。。
こんな制限かけんなよ><
varchar2(4000)になってんのに2000バイトまでしかINSERTできないってさー


しかも、setCharacterStream()を使用しても1テーブル内に大きな数のカラムが2つ以上ある場合は、正常にバインドされないんだとさ。
1つのテーブルにLONG型みたいなでかい数のカラムは存在できないってことらしいよ。
全然しらなかったけどさ。


ちなみにもう一つの解決方法は、日本語はJAVAのUTF-8では3byteでカウントされしまうから666文字までしか入らないんだな。だから2000バイトまでの文字列に分割して(a||b||c||d)みたいにSQL内でバインドさせるといいらしいよ。



web開発支援サイト作ってます
http://smileboys.fc2web.com/WebUtility/index.html

口パクの正体は・・・!?

2008年08月26日 23:14

おしゃれ雑貨ブログです↓
http://viealamode.blog46.fc2.com/

南明奈、秋山莉奈、小阪由佳が結成した

口パクユニット・Peachy’s(ピーチーズ)

デビュー曲「My Baby Boy」

歌声の正体が誰なのか、様々な憶測が飛んでいた。

この歌を歌っているのは実は・・・





女性お笑いトリオ・森三中

だったらしい。



全然わかんなかったーー。

web開発支援サイト作ってます
http://smileboys.fc2web.com/WebUtility/index.html

ドコモの2段階パケット定額プラン発表

2008年08月25日 23:08

おしゃれ雑貨ブログです↓
http://viealamode.blog46.fc2.com/

ドコモの2段階パケット定額プラン発表

NTTドコモは8月25日

2段階料金制のパケット定額サービス

「パケ・ホーダイ ダブル」
「Biz・ホーダイ ダブル」

を導入すると発表した。

2008年10月1日に開始するサービスです。



内容は

月額最低料金は1029円(1万2250パケットまで)

iモードのみ利用した場合の上限を4410円

フルブラウザも含めて利用した場合の上限額は5985円

となる


既存のパケ・ホーダイ、パケ・ホーダイフル(このほか、Biz・ホーダイ、パケットパック10、パケットパック30)に入ってる人はどうなるの?

2008年12月31日で新規受け付けを終了するけど

現ユーザーは継続して利用可能らしい。




てかさ

ようはパケ放4095円だったのが

4410円に値上げするってことでしょ?

だってパケ放題に入ってる人が4410円までガマンするはずないじゃないか!

パケ放題やるなら今のうちに既存の定額サービスに入っておいたほうがよさそうですね。

web開発支援サイト作ってます
http://smileboys.fc2web.com/WebUtility/index.html

パソコンでiモードの絵文字を表示する方法

2008年08月23日 17:41

おしゃれ雑貨ブログです↓
http://viealamode.blog46.fc2.com/

パソコンでiモードの絵文字を表示する方法



パソコンでiモードサイトを観覧すると絵文字が文字化けします

しかし

ある絵文字入力ソフトをいれると

iモード絵文字外字データが同時にインストールされ

表示できるようになります。


http://www.nttdocomo.co.jp/service/imode/make/content/pictograph/tool/

上記URLから「i絵文字」をダウンロードしてください

i絵文字は、iモードコンテンツ作成時に、

iモード対応絵文字の入力の支援とドコモホームページなどで使用されているi絵文字を表示するためのツールです。

絵文字を挿入したいアプリケーションが起動している状態でi絵文字を起動し

絵文字を挿入します。

i絵文字の使用方法の詳細は、ツールのヘルプでご確認ください。


web開発支援サイト作ってます
http://smileboys.fc2web.com/WebUtility/index.html


最近の記事