将二进制数据插入MySQL(没有PreparedStatement)

时间:2012-04-13 10:56:21

标签: java mysql jdbc

我试图在不使用预准备语句的情况下将一些二进制数据插入MySQL数据库。这样做的原因是我将数千个语句连接成一次运行一次。 (究竟MySQL转储和导入的工作方式)

我已尝试过以下陈述,但都失败了:

  

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

     

INSERT INTO my_table VALUES(1,CAST('g = F| }X 'ASBINARY),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 =÷的|¸} 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

这可能与编码有关吗?

有任何暗示, RO

3 个答案:

答案 0 :(得分:12)

找到了解决方案....虽然不是我在任何地方看到的东西......

您可以通过写入转换为HEX且前面带有0x

的字节来直接插入二进制数据

例如:

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

答案 1 :(得分:3)

您是否尝试在批处理模式下使用PreparedStatement?

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

有关如何使用JDBC和MySQL提高批量的详细信息,请查看此处:MySQL and JDBC with rewriteBatchedStatements=true

答案 2 :(得分:2)

准备好的声明无疑是最快的方法。您发现它太慢的原因可能是因为您没有在事务中使用它。你可能能够用base 64做一些可爱的东西,但它会很慢。