Java 除了',还有其他选择吗;rawtohex';要在H2中的blob列中插入数据?

Java 除了',还有其他选择吗;rawtohex';要在H2中的blob列中插入数据?,java,blob,h2,Java,Blob,H2,我有一个连接到Oracle数据库的Java应用程序。其中一个表包含一个blob列,我们使用该列进行填充,如下所示: String sql = "insert into table (id, name, data) values " + "(sequence.nextval, ?, ?)"; PreparedStatement ps = super.getConnection().prepareStatement(sql); InputStream stream = ne

我有一个连接到Oracle数据库的Java应用程序。其中一个表包含一个blob列,我们使用该列进行填充,如下所示:

String sql = "insert into table (id, name, data) values " +
             "(sequence.nextval, ?, ?)";
PreparedStatement ps = super.getConnection().prepareStatement(sql);
InputStream stream = new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
ps.setString(1, name);
ps.setBinaryStream(2, stream);
ps.executeUpdate();
公共类MyDAO扩展了JDBCDAO支持{
public void persist(字符串名称、字符串数据){
String sql=“插入表(id、名称、数据)值”+
“(sequence.nextval,utl_raw.cast_to_raw(?)”;
getJdbcTemplate().update(sql,[name,data]);
}
}
出于我所不知道的原因,我们在这个应用程序中不使用Hibernate、JPA或类似的东西。只需简单的SQL语句和Spring JDBC即可执行它们。(…)不管怎样,上述方法效果很好。至少在甲骨文方面

我已经用最少的数据建立了一个内存H2数据库,用于我们的JUnit测试。但H2中没有
utl_raw
包。改为使用。这是一种工作方式。。。但是它使数据长度增加了一倍。例如,如果我将字符串
“TEST”
保留在blob列中,然后检索它的值,它将变为
“TEST”
。作为字节数组,它应该是
[0,84,0,69,0,83,0,84]
。H2文件规定,这应该发生:

将字符串转换为十六进制表示形式。每个字符串字符使用4个十六进制字符

。我想这是支持UTF-16字符串(?)的方式,但我使用的是UTF-8。它实际上破坏了我的数据

是否有其他方法将blob存储在H2中?我见过,但我必须自己处理连接:

super.getConnection().prepareStatement(/*…*/).executeUpdate();
//释放语句和连接,处理异常
当然,它并不比我们现在拥有的更丑陋,但我仍然不愿意仅仅为了使它与我们的JUnit测试设置兼容而更改工作的生产代码

另一个选项是检索blob,就像它是一个UTF-16字符串一样,因此实际上每个字符使用4个十六进制。不过,我还是要为H2解决这个问题,而为Oracle解决这个问题


我还有别的选择吗?有没有办法告诉H2数据库在
rawtohex
中每个字符只使用1字节?或者我可以使用而不是
rawtohex

我不会在数据库(Oracle或H2)中进行转换

说用。这可能对甲骨文也有用?根据要转换的字符串的大小,其他方法的性能可能更高。顺便说一句,将字符串转换为二进制对象有什么特别的原因吗

如果您知道它总是相对较小的字符串(例如<1MB),那么您可以非常安全地尝试以下内容:

String sql = "insert into table (id, name, data) values " +
             "(sequence.nextval, ?, ?)";
PreparedStatement ps = super.getConnection().prepareStatement(sql);
InputStream stream = new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
ps.setString(1, name);
ps.setBinaryStream(2, stream);
ps.executeUpdate();

我一直在尝试在构建时使用Liquibase填充内存中的H2数据库


我遇到了同样的空间填充问题,但通过从使用RAWTOHEX切换到使用StringToUTF8解决了这个问题。

谢谢,我将在这两个数据库中尝试,尽管我仍然不相信仅仅为了测试目的而更改工作代码。至于将它们转换为二进制对象的原因。。。嗯,我们需要一个列来存储“大字符串”,有人决定用blob来存储。我想clob会是一个更好的选择,但是应用程序已经投入生产,所以我需要一个非常有说服力的理由来批准更改。我同意不只是为了测试目的而更改代码。如果您只打算使用Oracle,那么为什么不将其用于测试呢?另一方面,如果您可能在其他数据库上使用此代码,则需要进行类似的更改。我可以根据具体情况考虑迁移到CLOB的几个令人信服的原因。1.安全性:根据数据的来源(以及是否进行了清理),狡猾的用户可以向您发送一个可执行文件,存储在那里,稍后再检索。2.如果要使用Oracle文本进行搜索,BLOB需要“筛选”,这可能会降低效率: