插入和读取blob memsql

时间:2015-07-22 13:54:34

标签: java mysql blob memsql

我试图在我的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中不可用

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

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

然而,这很容易出现SQL注入问题(如果blob包含双引号,查询将失败,或导致不良结果),因此使用Joseph'应该使用答案。