【问题标题】:How to read a COMPRESS()-ed H2 blob column via JDBC?如何通过 JDBC 读取 COMPRESS()-ed H2 blob 列?
【发布时间】:2018-04-23 12:24:42
【问题描述】:

我有一个基于文件的 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 兼容的压缩数据?

【问题讨论】:

  • H2 是开源的,在 Java 中:您可以随时检查 H2 在内部做了什么。

标签: jdbc h2 deflate


【解决方案1】:

由于您已经在使用 H2 JDBC 访问数据库,您可以简单地使用 getBytes 检索压缩数据并使用 org.h2.tools.CompressToolexpand 方法解压缩它:

// .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");

【讨论】:

    猜你喜欢
    • 2016-04-16
    • 2011-07-25
    • 2012-09-30
    • 2016-11-16
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2021-08-18
    • 2019-11-10
    相关资源
    最近更新 更多