Java 将二进制数据插入MySQL(不带PreparedStatement)

Java 将二进制数据插入MySQL(不带PreparedStatement),java,mysql,jdbc,Java,Mysql,Jdbc,我试图在不使用预处理语句的情况下将一些二进制数据插入MySQL数据库。这样做的原因是,我将数千条语句连接到一个insert语句中,并运行一次。(MySQL转储和导入的具体工作方式) 我尝试过以下陈述,但都失败了: 在my_表中插入值(1,'g=���F|�}X���',2); 在my_表中插入值(1,强制转换('g=���F|�}X���' 作为二进制),2) 在my_表中插入值(1,CONVERT('g=���F|�}X���', 二进制),2) 在my_表中插入值(1,二进制'g=���F|

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

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

在my_表中插入值(1,'g=���F|�}X���',2);

在my_表中插入值(1,强制转换('g=���F|�}X���' 作为二进制),2)

在my_表中插入值(1,CONVERT('g=���F|�}X���', 二进制),2)

在my_表中插入值(1,二进制'g=���F|�}X���',(二)

我得到的错误是:

com.mysql.jdbc.MysqlDataTruncation:数据截断:第1行“二进制数据”列的数据太长

我用来执行该语句的代码很简单:

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

预处理语句无疑是最快的方法。您发现它太慢的原因可能是因为您没有在事务中使用它。您可能可以使用base 64做一些有趣的事情,但它会非常慢。

您是否尝试过在批处理模式下使用预处理语句

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

有关如何使用JDBC和MySQL提高批处理效率的更多详细信息,请查看此处:

找到了解决方案……尽管我在任何地方都没有看到文档

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

例如:

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

二进制数据只能通过
PreparedStatement
CallableStatement
插入,而不能使用简单的
Statement
插入。您知道您所做的“优化”可能毫无价值吗?准备好的语句的意义在于它们是“预编译”的通过MySQL,您只需向MySQL提供参数。无论您是否连接语句,您都会发送数千个值。当然,这是一个问题,因为您无法轻松插入二进制数据。您如何生成
insert
语句?编码可能很重要,但您也必须担心correct转义(例如,如果二进制数据中有一个
)。您是否也检查您的JDBC,例如
useUnicode
characterEncoding
?是的-已经一次批处理2000条语句。尝试编写比标准mysql导入更快的内容(具有额外的自定义功能)当前的性能比标准导入慢40%,即使我是并行处理的——带有二进制列的表(我使用PreparedStatements处理的表是最慢的)@所以,PreparedStatement并不比statement慢。如果它慢,你应该问一个为什么慢的问题,因为它不应该慢。Mysql连接器j有
客户端
prepared语句。它有一个rewrite batch参数,允许将rewrite batch insert语句重写到on语句中。@jilen我不理解你的评论。小心举个例子(如果你有更多的见解,请随意编辑答案,或者发布自己的答案)@Angelofechs我指的是这个。感谢这篇有用的帖子,我没有意识到mysql会自动解码十六进制。符号x'19c0300dc90e7cedf64703ed8ae8683b'也有效。这都在mysql参考手册的§9.1.4中有记录。