【问题标题】:Converting Blob to String yields just the Blob object name in Java将 Blob 转换为 String 只生成 Java 中的 Blob 对象名称
【发布时间】:2021-01-23 20:02:36
【问题描述】:

我正在尝试从 MySQL 数据库中读取 Blob,其中包含一些随机文本。

我的代码如下所示:

Connection conn = DriverManager.getConnection(connection_string);
String message = "Some message";
byte[] messageBytes = message.getBytes("UTF-8");

Blob blob = conn.createBlob();
blob.setBytes(1l,messageBytes);

String sql = "INSERT INTO db.dbname('blob') VALUES ('" + blob + "');"
PreparedStatement pat = conn.prepareStatement(sql);
pat.executeUpdate();

在另一个类中,我有从数据库中读取 blob 字段的代码:

//some SQL code to read the blob field here
Blob readBlob = resultSet.getBlob("blob");
byte[] bytes = readBlob.getBytes(1, (int) readBlob.length());
String str = new String(bytes);

System.out.println(str);

输出为:com.mysql.cj.jdbc.Blob@3be81fc2

我的代码与 StackOverflow 上的一些工作解决方案完全相同,所以我不知道到底哪里出了问题。

【问题讨论】:

  • CLOB 不会比 BLOB 更合适,因为 CLOB 用于字符数据,而 BLOB 用于非字符数据。
  • 我也将尝试使用 CLOB,但话又说回来,我不明白为什么我的代码不起作用。
  • 您是否在 INSERT 之后(以及在运行从数据库读取的 java 代码之前)检查了输入数据库的值?我的意思是您是否使用 MySQL Workbench 或类似工具检查了该值?此外,方法executeUpdate() 返回更改的行数。在您的情况下,该方法应返回 1(一)。有吗?

标签: java mysql string blob


【解决方案1】:

您在插入期间似乎犯了一个小错误。你的代码应该是这样的:

String sql = "INSERT INTO db.dbname('blob') VALUES (?);"
PreparedStatement pat = conn.prepareStatement(sql);
pat.setBlob(1, blob);
pat.executeUpdate();

请使用带有这些占位符的准备好的语句。否则攻击者很容易进行 SQL 注入攻击。如果您想了解 SQL 注入的工作原理,YouTube 上有一段很棒的 Computerphile 视频。

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 2017-09-17
    • 2019-01-15
    • 2015-11-27
    • 2021-05-25
    • 2011-09-16
    • 2015-03-29
    • 1970-01-01
    • 2014-07-27
    相关资源
    最近更新 更多