2

我正在尝试在我的 MemSQL 数据库中插入 blob。

这是我插入源代码的地方,因此我将其转换为 blob :

byte[] bytes = rs.getString(2).getBytes("utf-8");
Blob blob = insert.insertTableBinary(bytes);

这是我的 insertTableBinary 函数:

Blob blob = conn.createBlob();
blob.setBytes(1, bytes);
System.out.println(blob.length());
String sql = "INSERT INTO binaire(receipt) VALUES(\"" + blob + "\")";
executeSQL(sql);    
return blob;

此时 blob.lenght 等于 1555 但是当我读到它时,感谢:

String sql2 = "SELECT * FROM binaire";
Statement st = conn.createStatement();
ResultSet rs2 = st.executeQuery(sql2);
while(rs2.next()) { 
    Blob blob = rs2.getBlob(1);
    System.out.println(blob.length());
}

长度为25。奇怪的是,当我查看表中的数据时,我得到了:com.mysql.jdbc.Blob@6a8bc5d9

所以它不存储好东西不是吗?这是对对象的引用,但不是我认为的 blob。

但我不知道我做错了什么,我看到很多带有准备好的语句的例子,但这个功能在 MemSQL 中不可用

4

2 回答 2

1

blob编辑:尽可能离开byte[]

首先,我强烈建议使用 prepareStatement。

就像是

PreparedStatement stmt = con.preparedStatement("INSERT INTO binaire(receipt) VALUES(?)");
stmt.setObject(1, blob)
stmt.executeUpdate()

但是如果你讨厌准备好的陈述的想法,你可以这样做

String sql = "INSERT INTO binaire(receipt) VALUES(\"" + new String(blob) + "\")";

最好的,-JoYo

于 2015-07-22T15:57:50.123 回答
1

正如 Joseph 所建议的,发出查询的最佳方式是使用 JDBC 预准备语句。MemSQL支持它们,并且是执行参数化查询的首选方式,因为它们为您完成了所有转义。

你得到你的 25 字节字符串而不是你插入的字符串的原因是因为Blob' 的toString方法在 Java 中没有被覆盖,当它被隐式转换为字符串时,它只是返回某种 Java 指针而不是内容。基于我对 Java 的有限知识,约瑟夫在他的答案的后半部分建议的替代方案(明确转换为字符串)将导致相同的行为。解决它的一种方法是从 blob ( blob.getBytes) 中获取字节数组,并将其作为字符串传递

String sql = "INSERT INTO binaire(receipt) VALUES(\"" + new String(blob.getBytes()) + "\")";

但是,这很容易出现 SQL 注入问题(如果 blob 包含双引号,则查询将失败,或导致不希望的结果),因此应使用 Joseph 的答案中带有准备好的语句的解决方案。

于 2015-07-22T17:21:22.640 回答