【问题标题】:Ambiguos character reading db2 char field from jdbc从 jdbc 读取 db2 char 字段的不明确字符
【发布时间】:2017-05-30 15:20:10
【问题描述】:

我正在开发一个新的 Java 应用程序,该应用程序适用于 db2 中无法更改的旧数据库。在其中一张表中有 char(32) 列,其中包含 comp3 字符。

我们使用 ibm db2 jdbc type 4 驱动程序阅读本专栏。当我们检查字节解包字符时,我们发现只要 bbdd 中有一个值为 25 的字节,jdbc 驱动程序就会将其恢复为值 15。值为 15 的字节也恢复为 15 值,所以我们有一个我们不知道如何解决的模棱两可的值。

阅读 ibm 文档,似乎读取字符串会将它们从 ebcdic 转换为 ascii/unicode,这似乎是问题的根源。

¿ 有没有办法在不进行这种转换的情况下恢复字段的真实字节?

请注意 resultSet.getBinaryStream() 不起作用,因为它是一个 char 列,我们不能以任何方式更改数据库。我们只能影响到jdbc连接和java代码。

【问题讨论】:

  • 作为查询的一部分,或许可以尝试将CAST char(32) 列转换为某种兼容类型,以便能够使用 getBinaryStream()。
  • COMP-3 映射到 SQL DECIMAL 数据类型,而后者应由 JDBC 驱动程序自动转换为 java.math.BigDecimal -- 只需使用 resultSet.getBigDecimal()

标签: java jdbc db2


【解决方案1】:

COMP-3 是压缩数字的 COBOL 术语。

关于 IBM 中型或大型机系统上的数值的快速课程。固定小数用(精度,比例)描述。所以 (5,2) 数的最大值为 999.99。

给定值:012.34
分区十进制 (5,2) 将是 x'F0F1F2F3F4'(5 个字节)
压缩十进制 (5,2) 将是 x'01234F'(3 个字节)

给定值:012.34-
分区十进制 (5,2) 将是 x'F0F1F2F3D4'
压缩十进制 (5,2) 将是 x'01234D'

还要注意字符串 '01234' 将是 x'F0F1F2F3F4'

将这些存储在 DB 的字符列中是没有意义的。

理想情况下,您应该修复您的数据库,以便将数值存储在数值列中。下一个最好的方法是定义一个视图,将数据正确地提取到它的组件列中。

如果您正在处理嵌入在字符串中的正分区小数,那么使用 CAST() 进行转换并不是什么大问题。负值有点困难

压缩十进制是另一回事。在您的 Java 应用程序中可能最容易做到,快速谷歌搜索一些可能的解决方案。

在 SQL 中执行此操作需要使用 HEX() 函数返回一个您可以处理的字符串。您提到该列是 32 个字符,假设前 29 个字符是有效字符串,后 3 个字符包含压缩 (5,2) 数字...

select substr(mycol,1,29) as string_value 
      dec(
         dec(substr(hex(substr(mycol,30,3)),1,3)
             concat '.' concat
             substr(hex(substr(mycol,30,3)),4,2),
         5,2) *
         (case when substr(hex(substr(mycol,30,3)),6,1) = 'D'
                 then -1 else 1 end),
       5,2) as numeric_value
  from mytable

【讨论】:

  • 我正在读取一个包含压缩数字和混合字符串的字段,并且该批次的格式取决于另一个值,所以我无法从 sql 解释它而不制作一个可怕的 sql,困难维护。我将使用 Andrew S 选项将其转换为二进制文件,或者使用 hex()。我不确定哪一个更适合。然后从java处理整个字节数组。
【解决方案2】:

正如@Andrew 暗示的那样,最终的解决方案将是转换为二进制文件:

select cast(field as binary(size in bytes)) from table where ...

这样做我可以使用 ResultSet.getBinaryStream() 或 ResultSet.getBytes() 读取值,获取存储在数据库中的相同信息,并且两者之间没有奇怪的转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2018-02-07
    • 2021-04-23
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多