【问题标题】:Inserting and reading blob memsql插入和读取 blob memsql
【发布时间】:2015-07-22 13:54:34
【问题描述】:

我正在尝试在我的 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 中没有此功能

【问题讨论】:

    标签: java mysql blob singlestore


    【解决方案1】:

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

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

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

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

    【讨论】:

    【解决方案2】:

    编辑:如果可以,请将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

    【讨论】:

    • 我不讨厌准备好的语句,它在 MemSQL 中不存在。构造函数 string(Blob) 也不存在,所以我不能使用“ new String(blob) ”。并且使用 blob.toString() 不会改变任何东西
    • 我读你的问题太快了,我认为 blob 是一个字节 []。无论哪种方式,con.prepareStatement 都是 JDBC 的东西,不是吗? MemSQL 不在乎。直接使用 byte[],甚至使用 String。
    猜你喜欢
    • 2012-07-11
    • 1970-01-01
    • 2011-05-12
    • 2017-05-15
    • 1970-01-01
    • 2018-01-08
    • 2012-04-11
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多