将二进制数据插入MySQL(不使用PreparedStatement)

17 浏览
0 Comments

将二进制数据插入MySQL(不使用PreparedStatement)

我正在尝试将一些二进制数据插入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: Data truncation: Data too long for column 'binary_data' at row 1

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

conn.createStatement().executeUpdate(sql);

预编译语句工作正常(但在这种情况下速度太慢)

实际上在数据库中显示的字符串略有不同:

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

0
0 Comments

在使用PreparedStatement的批处理模式时,出现了性能问题。作者已经尝试了批处理模式,但是使用PreparedStatement的方式比标准的mysql导入要慢40%。特别是处理包含二进制列的表时速度最慢。

问题的解决方法是使用Mysql connector j的client-side prepared statement,并使用rewrite batch参数将批量插入语句重写为单个语句。具体的解决方法可以参考链接:MySQL and JDBC with rewriteBatchedStatements=true。

以上是这个问题的出现原因和解决方法的整理。

0
0 Comments

问题的出现原因是在使用MySQL插入二进制数据时,通常会使用PreparedStatement来处理,但是有时可能需要直接将二进制数据插入到MySQL中。解决方法是将二进制数据转换为十六进制,并在前面加上0x,然后直接插入到MySQL中。

具体来说,可以使用以下形式的语句来插入二进制数据:

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

另外,还可以使用x'...'的形式来表示二进制数据,例如:

INSERT INTO my_table VALUES (1,x'19c0300dc90e7cedf64703ed8ae8683b',2);

这些方法在MySQL参考手册的§9.1.4中有详细的文档说明。

,通过将二进制数据转换为十六进制,并在插入语句中使用0x或x'...'的形式,可以直接将二进制数据插入到MySQL中,而不需要使用PreparedStatement。

0
0 Comments

问题的原因是没有使用预编译语句(prepared statement)在一个事务中进行操作,导致速度慢。

解决方法是使用预编译语句(prepared statement)来插入二进制数据。下面是一个示例代码:

Connection conn = DriverManager.getConnection(url, username, password);
conn.setAutoCommit(false); // 开启事务
String insertSql = "INSERT INTO table_name (binary_data) VALUES (?)";
PreparedStatement pstmt = conn.prepareStatement(insertSql);
// 读取二进制文件
File file = new File("path_to_binary_file");
FileInputStream fis = new FileInputStream(file);
pstmt.setBinaryStream(1, fis, (int) file.length());
pstmt.executeUpdate();
conn.commit(); // 提交事务
pstmt.close();
conn.close();

上述代码中,首先获取数据库连接,并设置自动提交为false,开启事务。然后,准备插入的SQL语句,其中包含一个参数用于接收二进制数据。接着,读取二进制文件并将其作为参数传递给预编译语句的参数。最后,执行更新操作并提交事务。注意,在完成操作后要关闭预编译语句和数据库连接。

通过以上的解决方法,我们可以在不使用预编译语句的情况下将二进制数据插入到MySQL数据库中。

0