【发布时间】:2012-04-25 17:46:05
【问题描述】:
我正在尝试在不使用准备好的语句的情况下将一些二进制数据插入 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);
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 工作正常(但在这种情况下太慢了)
数据库中的实际 String 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
这可能与编码有关吗?
非常感谢任何提示, 罗
【问题讨论】:
-
二进制数据只能通过
PreparedStatement或CallableStatement插入,不能使用简单的Statement。 -
您知道您所做的“优化”可能毫无价值吗?准备好的语句的重点是它们是由 MySQL“预编译”的,你只需向 MySQL 提供参数。无论您是否连接语句,无论如何您都会发送数千个值。很自然,这成了一个问题,因为您不能轻易地插入二进制数据。
-
您是如何生成
INSERT语句的?编码可能很重要,但您还必须担心正确的转义(例如,如果二进制数据中有')。你也检查你的JDBCconnection parameters,比如useUnicode和characterEncoding?