Java 将二进制数据插入MySQL(不带PreparedStatement)
我试图在不使用预处理语句的情况下将一些二进制数据插入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 这可能与编码有关吗 任何非常有用的暗示,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|
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中有记录。