首页 > 解决方案 > Oracle db 和原始文件上的 clob 数据的字节数不同

问题描述

我有一个 png 文件,它在 oracle db 中存储为 CLOB。

我想使用下面的代码通过 jdbc 模板获取这些数据

LobHandler lob = new DefaultLobHandler();
return jdbcTemplate.queryForObject(
  "select table from column",
  arr,
  (rs, rowNum) -> lob.getClobAsString(rs, "CLOB_DATA")
);

由于oracle db中的编码是WE8MSWIN1252,因此我将按如下方式转换为字节数组

clob.getBytes(Charset.forName("windows-1252"));

但是,当我使用以下代码手动读取文件并与数据库数据进行比较时,我得到了不同的字节。

File path = new File("path/to/file");
Files.readAllBytes(path.toPath());

某些字符未正确加载。可能是什么问题呢?

标签: javaoraclejdbcclob

解决方案


我有一个 png 文件,它在 oracle db 中存储为 CLOB。

不要这样做。如果您有二进制数据,请将其存储为二进制格式,例如 a BLOB,并且不要将其存储为不适合该目的的格式。

但是,当我使用以下代码手动读取文件并与数据库数据进行比较时,我得到了不同的字节。

那是因为您将 aCLOB用于它不打算用于的东西。

可能是什么问题呢?

问题是您为数据使用了错误的数据类型。

我无法将其更改为 blob,因为已经在 DB 中添加了数据作为 CLOB。

将它们全部更改为 a BLOB,然后在需要获取字符数据时将其转换BLOB为 a 。CLOB尝试以另一种方式进行操作(无需对二进制文件进行任何编码即可安全地存储为字符串)将继续创建您已经拥有的问题。

如果您确实必须使用 a CLOB(请不要),则以编码格式存储二进制文件,例如Base64,它可以安全地存储为字符数据。


推荐阅读