- PR -

データベースへのバイナリデータの挿入について

1
投稿者投稿内容
1048
会議室デビュー日: 2003/09/08
投稿数: 18
投稿日時: 2003-10-07 13:50
こんにちは。1048です。

データベースにバイナリデータを挿入したいのですが、
Mysqlのデータベースに挿入するとうまくいきません。
Oracleではうまくいきました。

以下のソースを実行したところ、
以下のエラーが発生しました。
どうやらPreparedStatement.setBinaryStreamがうまく動いていないようです。
他のメソッドで試したところ、.setStringメソッドは動作しました。

もしよければ、どなたか知恵をお貸しください。

============テーブル定義=============

CREATE TABLE test
(ID CHAR(8) NOT NULL,
DATA BLOB NOT NULL,
CONSTRAINT PK_test PRIMARY KEY (ID) )

=====================================

----------ソース(一部抜粋)-----------

private Connection connection=null;
private PreparedStatement Pstatement =null;

<省略>
synchronized public void test(String ID,String File_name) throws Exception{

Class.forName("org.gjt.mm.mysql.Driver");
connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=SJIS","user","password");

File file=new File(File_name);
long fileLength = file.length();
int fLength = (int)fileLength;

InputStream fin = new FileInputStream(File_name);

Pstatement=connection.prepareStatement("insert into test (ID,DATA) values ('"+ID+"',?)");

Pstatement.setBinaryStream(1,fin,fLength);←ここが怪しい!
Pstatement.executeUpdate();←ここでエラー

Pstatement.close();
connection.close();
}
---------------------------------------

*********エラーメッセージ**************

javax.servlet.ServletException: Syntax error or access violation, message from server: "You have an error in your SQL syntax near ''255044462D312E340A25E4E3CFD20A342030206F626A0A3C3C2F4C656E6774682035203020520A2' at line 1"
<省略>
root cause

java.sql.SQLException: Syntax error or access violation, message from server: "You have an error in your SQL syntax near ''255044462D312E340A25E4E3CFD20A342030206F626A0A3C3C2F4C656E6774682035203020520A2' at line 1"
<省略>
****************************************

【環境】
Windows2000
Java2SDK, Standard Edition 1.4.1_05
Tomcat4.1.27
struts 1.1
Eclipse2.1.1

mysql 3.23.47 -nt
Oracle 8i


[ メッセージ編集済み 編集者: 1048 編集日時 2003-10-07 14:39 ]
1048
会議室デビュー日: 2003/09/08
投稿数: 18
投稿日時: 2003-10-07 13:55
いきなり自己レスです。

絵文字が入ってしまいましたね。
絵文字の書き方をしらなかったんです。
すみません。
そこには
"8)"
"8)"
'8)'
数字の八、閉じ括弧

が書いてありました。
また絵文字になってしまうといけないので、いろいろ
書いてみました。

[ メッセージ編集済み 編集者: 1048 編集日時 2003-10-07 14:30 ]
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2003-10-07 14:26
メッセージを読んだ限りでは、SQLの構文のエラーだと思いますが。
SQLはRDBMSにより異なるので、Oracleで動いたからと言って他のRDBMSで動くとは限りません。(実はMySQLには詳しくないのですが^^;)

それから、顔文字についてですが、下の「編集」を押して「□この投稿で 顔文字(スマイリー) を使わない」をチェックすれば、顔文字の変換はされずに表示できますよ。
1048
会議室デビュー日: 2003/09/08
投稿数: 18
投稿日時: 2003-10-07 14:59
たーぞうさん、ご返答ありがとうございます。

顔文字はすぐ下にチェックボックスがあったんですね。うかつでした。

エラーを見た感じではSQLエラーなんですが
Blob型のDATAに文字列を直接ぶち込むとうまく動作するのですよ〜。
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2003-10-07 15:18
も、もしかして・・・
コード:

Pstatement.setBinaryStream(2,fin,fLength);


が正しいのではないですか?

BLOB型の列は2列目なので、1番目の引数にはそのまま2(0始まりではなく1始まり)を設定しないとだめですね。


[ メッセージ編集済み 編集者: たーぞう 編集日時 2003-10-07 15:34 ]
顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 2003-10-07 15:23
はじめまして。顔爺と申します。

http://javaalmanac.com/egs/java.sql/InsertPs.html

なぞを見る限り、1048 さんの行っていることは正しいと思います。
んで妄想ですが、useUnicode=true&characterEncoding=SJIS あたりが
悪さしている可能性はありますでしょうか。

-- 以下、修正 --
MySQL の PreparedStatement のソース(最新)を見てみましたら、
SJIS 専用ロジック(笑)が走っていますので、上記発言は取り消します。

該当個所は PreparedStatement.java の 2357 行目、
private final void streamToBytes(Buffer packet, InputStream in,
boolean escape, int streamLength, boolean useLength)
です。

MySQL の JDBC ドライバの changelog に
05-23-03 - Version 3.0.8-stable
Use hex escaping for PreparedStatement.setBytes()/setBinaryStream()
when the character set is Shift_JIS, workaround for parsing bug in server.

と記載されていますので、もし JDBC ドライバが古いのであれば、最新にしてみると
いうのはいかがでしょうか。



[ メッセージ編集済み 編集者: 顔爺 編集日時 2003-10-07 15:59 ]

[ メッセージ編集済み 編集者: 顔爺 編集日時 2003-10-07 16:00 ]
1048
会議室デビュー日: 2003/09/08
投稿数: 18
投稿日時: 2003-10-07 16:29
たーぞうさん、顔爺さん、ご返答ありがとうございます。

ご助言いただいたことを試してみたところ、
jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=SJIS
の後半部分の「?useUnicode=true&characterEncoding=SJIS」を
なくしてみたところ、うまくいきました。

これを取っちゃうと何が起こるかわからないので
何か問題があるか知ってる方がいたら、
またご助言お願いします。

問題が起こったらまた私のほうから書き込みます。

ありがとうございました。

1

スキルアップ/キャリアアップ(JOB@IT)