# CacheIrisLOB字段解码 **Repository Path**: wygd/cache-iris-lob-field-decoding ## Basic Information - **Project Name**: CacheIrisLOB字段解码 - **Description**: 东华 Caché / IRIS EMR 大字段(流字段)解码工具 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-07-02 - **Last Updated**: 2026-07-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Caché / IRIS 大字段解码 ## 两类流字段 Intersystems Caché/IRIS 把大字段分两种 Stream,分别映射成两个 JDBC 类型: | JDBC 类型 | Caché 内部类 | 存什么 | |---|---|---| | `LONGVARCHAR` | `GlobalCharacterStream`,**字符流** | 纯文本,中文站按 GBK 存储 | | `LONGVARBINARY` | `GlobalBinaryStream`,**二进制流** | 原始字节,EMR 里实际是 UTF-8 文本 / 图片 | ## 两种字段怎么读、怎么处理 | 调用 | 字符流 (`LONGVARCHAR`) | 二进制流 (`LONGVARBINARY`) | |---|---|---| | `getString()` | ⚠️ 乱码(驱动不重编码) | ✅ **UTF-8 原样返回,就是正文** | | `getCharacterStream()` | ✅ **唯一正解**,驱动内部 GBK 解码成 `char` | ❌ 抛 `Unable to read stream data` | | `getBinaryStream()` | ⚠️ 拿到 GBK 字节,不常用 | ✅ 拿到原始字节,再 `new String(b,"UTF-8")` | | `getBytes()` | ❌ 抛 `Restricted data type attribute violation` | ❌ 同 | > **规则**:字符流 → `getCharacterStream` + `GBK`; > 二进制流 → `getString` 或 `getBinaryStream` + `UTF-8`。 > 禁用 `getBytes`,禁止 SQL 层对这两种字段做 CAST / LEN / WHERE / LIKE。 ## 读代码示例 ### 字符流(纯文本,GBK) ```java Reader rd = rs.getCharacterStream("tplusnText"); StringBuilder sb = new StringBuilder(); char[] buf = new char[1 << 16]; int n; while ((n = rd.read(buf)) > 0) sb.append(buf, 0, n); rd.close(); String text = sb.toString(); // 已经是 GBK 解码后的明文 byte[] gbk = text.getBytes("GBK"); // 想拿 GBK 字节 ``` ### 二进制流(UTF-8 文本) ```java String xml = rs.getString("InstanceData"); // 直接拿到裸 UTF-8 字节解码的正文 // 或 try (InputStream in = rs.getBinaryStream("InstanceData")) { byte[] b = in.readAllBytes(); // 原始字节,再 new String(b,"UTF-8") } ``` ## 工程结构 ``` src/main/java/com/wygd/cache/emr/ ├── CacheEmrFieldReader.java 主接口,按 JDBC 类型自动选路径 ├── EmrFieldProber.java 探针,打印一列的 JDBC 类型 / 是否压缩 ├── EmrFieldType.java 字段枚举 + fromJdbcType(int) ├── EmrInstanceXml.java EMR 常用 XML 标签/属性常量 ├── ProbeResult.java 探针结果 └── Demo.java main 入口,连库实测一次 ``` ## 一句话速查 ``` 字符流 (LONGVARCHAR) → getCharacterStream + GBK 二进制流(LONGVARBINARY) → getString 即 UTF-8 原文 其他任何组合 → 驱动报错,别试 ```