插入和读取 blob memsql
Inserting and reading blob memsql
我正在尝试将 blob 插入到我的 MemSQL 数据库中。
这是我插入源代码的地方,因此我将其转换为 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。
奇怪的是,当我查看 table 中的数据时,我得到:
com.mysql.jdbc.Blob@6a8bc5d9
所以它没有储存好东西吗?这是对对象的引用,而不是我认为的 blob。
但我不知道我做错了什么,我看到很多带有准备语句的示例,但 MemSQL 中没有此功能
编辑:如果可以,将 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
正如 Joseph 所建议的,发出查询的最佳方式是使用 JDBC 准备好的语句。它们 受到 MemSQL 的支持,并且是执行参数化查询的首选方式,因为它们会为您完成所有转义。
你得到你的 25 字节字符串而不是你插入的字符串的原因是因为 Blob
的 toString
方法在 Java 中没有被覆盖,当它被覆盖时隐式转换为字符串,它只是 returns 某种 Java 指针而不是内容。根据我对 Java 的有限了解,约瑟夫在他的答案的后半部分建议的替代方案(明确转换为字符串)会导致相同的行为。解决它的一种方法是从 blob (blob.getBytes
) 获取字节数组,并将其作为字符串传递
String sql = "INSERT INTO binaire(receipt) VALUES(\"" + new String(blob.getBytes()) + "\")";
然而,这很容易出现 SQL-注入问题(如果 blob 包含双引号,查询将失败,或导致不良结果),因此准备好的解决方案应该改用 Joseph 的回答中的陈述。
我正在尝试将 blob 插入到我的 MemSQL 数据库中。
这是我插入源代码的地方,因此我将其转换为 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。 奇怪的是,当我查看 table 中的数据时,我得到: com.mysql.jdbc.Blob@6a8bc5d9
所以它没有储存好东西吗?这是对对象的引用,而不是我认为的 blob。
但我不知道我做错了什么,我看到很多带有准备语句的示例,但 MemSQL 中没有此功能
编辑:如果可以,将 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
正如 Joseph 所建议的,发出查询的最佳方式是使用 JDBC 准备好的语句。它们 受到 MemSQL 的支持,并且是执行参数化查询的首选方式,因为它们会为您完成所有转义。
你得到你的 25 字节字符串而不是你插入的字符串的原因是因为 Blob
的 toString
方法在 Java 中没有被覆盖,当它被覆盖时隐式转换为字符串,它只是 returns 某种 Java 指针而不是内容。根据我对 Java 的有限了解,约瑟夫在他的答案的后半部分建议的替代方案(明确转换为字符串)会导致相同的行为。解决它的一种方法是从 blob (blob.getBytes
) 获取字节数组,并将其作为字符串传递
String sql = "INSERT INTO binaire(receipt) VALUES(\"" + new String(blob.getBytes()) + "\")";
然而,这很容易出现 SQL-注入问题(如果 blob 包含双引号,查询将失败,或导致不良结果),因此准备好的解决方案应该改用 Joseph 的回答中的陈述。