6

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

我尝试了以下语句,但都失败了:

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

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

插入 my_table 值 (1,CONVERT('g=���F|�}X���', BINARY),2);

插入 my_table 值 (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

这可能与编码有关吗?

非常感谢任何提示,Ro

4

3 回答 3

16

找到了解决方案....虽然我在任何地方都没有看到记录.....

您可以通过写入转换为 HEX 并以 0x 开头的字节直接插入二进制数据

例如:

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 回答