将二进制数据插入MySQL(不使用PreparedStatement)
将二进制数据插入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
问题的出现原因是在使用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。
问题的原因是没有使用预编译语句(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数据库中。