java - 插入和读取 blob memsql

标签 java mysql blob singlestore

我正在尝试将 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。 奇怪的是,当我查看表中的数据时,我得到: com.mysql.jdbc.Blob@6a8bc5d9

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

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

最佳答案

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

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

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

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

关于java - 插入和读取 blob memsql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31565230/

相关文章:

java - 使用 Apache Ant 恢复停止的构建过程

mysql - 为什么 MySql 将 INT 类型列视为 LONG?

MySQL 没有插入反斜杠

php - MySQL 由多个用户更新同一行,如计数器

java - Spring Boot rabbit mq spring.rabbitmq.listener.simple.concurrency 从不工作

java - 目标无法访问, 'null' 在 JSF 中返回 null

c# - Azure Blob 存储下载所有文件

oracle - 从表中导出 BLOB 图像

java - 以编程方式交换 JFrame 中的两个 JPanel

PHP - BLOB 未插入 MySQL 数据库