- - PR -
データベースへのバイナリデータの挿入について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||
|
投稿日時: 2003-10-07 13:55
いきなり自己レスです。
絵文字が入ってしまいましたね。 絵文字の書き方をしらなかったんです。 すみません。 そこには "8)" "8)" '8)' 数字の八、閉じ括弧 が書いてありました。 また絵文字になってしまうといけないので、いろいろ 書いてみました。 [ メッセージ編集済み 編集者: 1048 編集日時 2003-10-07 14:30 ] | ||||
|
投稿日時: 2003-10-07 14:26
メッセージを読んだ限りでは、SQLの構文のエラーだと思いますが。
SQLはRDBMSにより異なるので、Oracleで動いたからと言って他のRDBMSで動くとは限りません。(実はMySQLには詳しくないのですが^^;) それから、顔文字についてですが、下の「編集」を押して「□この投稿で 顔文字(スマイリー) を使わない」をチェックすれば、顔文字の変換はされずに表示できますよ。 | ||||
|
投稿日時: 2003-10-07 14:59
たーぞうさん、ご返答ありがとうございます。
顔文字はすぐ下にチェックボックスがあったんですね。うかつでした。 エラーを見た感じではSQLエラーなんですが Blob型のDATAに文字列を直接ぶち込むとうまく動作するのですよ〜。 | ||||
|
投稿日時: 2003-10-07 15:18
も、もしかして・・・
が正しいのではないですか? BLOB型の列は2列目なので、1番目の引数にはそのまま2(0始まりではなく1始まり)を設定しないとだめですね。 [ メッセージ編集済み 編集者: たーぞう 編集日時 2003-10-07 15:34 ] | ||||
|
投稿日時: 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 ] | ||||
|
投稿日時: 2003-10-07 16:29
たーぞうさん、顔爺さん、ご返答ありがとうございます。
ご助言いただいたことを試してみたところ、 jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=SJIS の後半部分の「?useUnicode=true&characterEncoding=SJIS」を なくしてみたところ、うまくいきました。 これを取っちゃうと何が起こるかわからないので 何か問題があるか知ってる方がいたら、 またご助言お願いします。 問題が起こったらまた私のほうから書き込みます。 ありがとうございました。 |
1