2012-04-13 11 views
5

MySQLデータベースにいくつかのバイナリデータを挿入しようとしています。この理由は、何千ものステートメントを1回の挿入で1回の挿入に連結するためです。 (MySQLは&輸入作品をダンプ正確にどのように)バイナリデータをMySQLに挿入する(PreparedStatementを使用しない)

私は、次のステートメントを試してみましたが、インクルードがすべて失敗している:my_tableにVALUES INTO

INSERT(1、 'G = F |} X '、2);

INSERT INTO my_table VALUE(1、CAST( 'g = F| )X ' AS BINARY)、2);

INSERT INTO my_table VALUE(1、CONVERT( 'g = F| )X '、BINARY)、2);

|(2 '} X、G = F'、1、BINARY)私が手にエラーがあるMY_TABLE値に

INSERT com.mysql.jdbc.MysqlDataTruncation:データの切り捨て:行1

でのデータ列には長すぎる「binary_data」私は文を実行するために使用するコードは単純です:

conn.createStatement()。executeUpdate(sql);

のPreparedStatementsが正常に動作(この場合には遅すぎる)

データベース内の実際の文字列Iは少しdifferet表示:

G =÷の|¸} Xの£iは【

バイナリビュー:67 3D 81 F7 19 F3 46 7C B8 7dと58 8C 10 A3 EC 5B

のJavaバイト:103、61、-127、-9、25 -13、70、124、 -72,125,88、-116、 16、-93、-20、91

これはエンコーディングとは何かだろうか?

任意のヒントがはるかにapprecaited、 Roの

+3

バイナリデータは 'PreparedStatement' OR' CallableStatement'なく通って挿入することができます単純な 'Statement'を使って可能です。 –

+2

あなたがした「最適化」はおそらく役に立たないと知っていますか?プリペアドステートメントのポイントは、それらがMySQLによって「プリコンパイル」されており、MySQLにパラメータを供給することだけです。文を連結するかどうかに関係なく、何千もの値を送信します。そして当然、バイナリデータを簡単に挿入することはできないので、これは問題であることが判明しました。 –

+0

どのように 'INSERT'文を生成していますか?エンコーディングは問題になるかもしれませんが、正しいエスケープ(例えば、バイナリデータに '' 'がある場合)についても心配する必要があります。 'useUnicode'や' characterEncoding'のようなあなたのJDBC [接続パラメータ](http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html)もチェックしてください。 '? –

答えて

11

私が見た何かがどこにも文書化されてはいないが....解決策を見つけた.... 。

あなたがバイトを書き込むことによって、直接バイナリデータを挿入することができますがHEXに変換され、例えば0xの

が付け加え:

INSERT INTO my_table VALUES (1,0x19c0300dc90e7cedf64703ed8ae8683b,2); 
+1

私はmysqlがこのような16進数を自動的にデコードするのを気付かず、この有益なポストのおかげです。 – fabspro

+1

x'19c0300dc90e7cedf64703ed8ae8683bという表記も機能します。これは、MySQLリファレンスマニュアルの§9.1.4にすべて記載されています。 – olefevre

2

プリペアドステートメントは、間違いなく最速のアプローチです。遅すぎる理由は、トランザクション内で使用していないためです。あなたはベース64でかわいい何かをすることができるかもしれませんが、非常に遅いでしょう。

3

PreparedStatementをバッチモードで使用しようとしましたか?あなたはJDBCおよびMySQLで効率的なバッチは、こちらをご覧作ることができる方法の詳細については

PreparedStatement pStmt = ...; 
    while(...) { // use for or whatever loop 
     pStmt.clearParameters(); 
     pStmt.setBinaryStream(2, ...); 
     pStmt.addBatch(); 
    } 
    pStmt.executeBatch(); 

MySQL and JDBC with rewriteBatchedStatements=true

+0

+1はバッチモードです。 –

+0

はい、一度に2000個のステートメントをバッチ処理しています。 標準のmysqlインポートより高速なものを作成しようとしています(余分なカスタム機能を使用) 現在のパフォーマンスは、標準のインポートよりも40%遅いです。 PreparedStatementsが最も遅い) –

+0

@Ro。したがって、PreparedStatementはStamementよりも遅くはありません。それがそうであるべきであるならば、あなたはそれがなぜであるべきかという質問をするべきです。 –

関連する問題