6

準備済みステートメントを使用せずに、バイナリ データを MySQL データベースに挿入しようとしています。この理由は、何千ものステートメントを 1 回の挿入で 1 回の実行に連結するためです。(まさに MySQL のダンプとインポートの仕組み)

次のステートメントを試しましたが、すべて失敗しています。

INSERT INTO my_table VALUES (1,'g=���F|�}X���',2);

INSERT INTO my_table VALUES (1,CAST( 'g=���F|�}X���' AS BINARY),2);

INSERT INTO my_table VALUES (1,CONVERT( 'g=���F|�}X���', BINARY),2);

INSERT INTO my_table VALUES (1,BINARY 'g=���F|�}X���',2)

私が得るエラーは次のとおりです。

com.mysql.jdbc.MysqlDataTruncation: データの切り捨て: 行 1 の列 'binary_data' のデータが長すぎます

ステートメントを実行するために使用するコードは次のとおりです。

conn.createStatement().executeUpdate(sql);

PreparedStatements は正常に動作します (ただし、この場合は遅すぎます)

データベース内の実際の文字列 I は、少し異なって表示されます。

g=÷óF|¸}X£ì[

バイナリ ビュー: 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

これは Encoding と関係があるのでしょうか?

どんなヒントでも大歓迎です、Ro

4

3 に答える 3

16

Found the solution .... Although not something I saw documented anywhere .....

You can insert Binary data directly by writing the bytes converted to HEX and preceeded by 0x

For example:

INSERT INTO my_table VALUES (1,0x19c0300dc90e7cedf64703ed8ae8683b,2);
于 2012-04-23T15:10:19.390 に答える
3

バッチ モードで PreparedStatement を使用しようとしましたか?

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

JDBC と MySQL を使用してバッチを効率的にする方法の詳細については、こちらを参照してください: MySQL と JDBC with rewriteBatchedStatements=true

于 2012-04-13T11:20:22.087 に答える
2

準備されたステートメントは間違いなく最速のアプローチです。遅すぎると感じる理由は、トランザクション内で使用していないためかもしれません。base 64 で何かかわいいことができるかもしれませんが、非常に遅くなります。

于 2012-04-13T11:12:00.390 に答える