如何通过JDBC读取COMPRESS() - 编辑H2 blob列?

时间:2018-04-23 12:24:43

标签: jdbc h2 deflate

我有一个基于文件的H2数据库(引擎版本1.4.196),其中mediumblob列包含COMPRESS()函数返回的数据:

create table foo (compressed_data mediumblob);
...
insert into foo (compressed_data) values (COMPRESS(STRINGTOUTF8('Test'), 'DEFLATE'));

(该表由flyway创建并填充。)

我想首先在JDBC客户端中读取此数据而不先调用DECOMPRESS()。 (我想做解压缩客户端以与另一个系统兼容)。我试图通过InflaterInputStream读取数据,这可以解压缩DEFLATE数据:

try (InputStream dbStream = rs.getBinaryStream("compressed_data");
     InflaterInputStream inflaterStream = new InflaterInputStream(dbStream);
    ) {
        inflaterStream.read();
        ...

但这会导致错误:

java.util.zip.ZipException: incorrect header check
    at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164)
    ...

有什么方法可以从H2中的列中获取InflaterInputStream兼容的压缩数据?

1 个答案:

答案 0 :(得分:1)

由于您已经使用H2 JDBC访问数据库,因此只需使用getBytes检索压缩数据,并使用expand org.h2.tools.CompressTool方法解压缩它:

// .java source file is Cp1252 encoded
String sql = "SELECT COMPRESS(STRINGTOUTF8('fermé'), 'DEFLATE') AS foo";
ResultSet rs = st.executeQuery(sql);
rs.next();
byte[] bytesOut = rs.getBytes(1);
byte[] expanded = org.h2.tools.CompressTool.getInstance().expand(bytesOut);
String strOut = new String(expanded, "UTF-8");