Java 从jdbc读取db2 char字段的模糊字符

Java 从jdbc读取db2 char字段的模糊字符,java,jdbc,db2,Java,Jdbc,Db2,我正在一个新的java应用程序中工作,该应用程序针对db2中无法更改的遗留数据库。其中一个表中有一个包含comp3字符的char32列 我们使用IBMDB2JDBCType4驱动程序阅读本专栏。当我们检查字节以解压缩字符时,我们发现只要bbdd中有一个值为25的字节,jdbc驱动程序就会将其恢复为值15。值为15的字节也会恢复为15值,因此我们有一个不明确的值,我们不知道如何解决 在ibm文档中,读取字符串似乎将它们从ebcdic转换为ascii/unicode,这似乎是问题的根源 有没有一种方

我正在一个新的java应用程序中工作,该应用程序针对db2中无法更改的遗留数据库。其中一个表中有一个包含comp3字符的char32列

我们使用IBMDB2JDBCType4驱动程序阅读本专栏。当我们检查字节以解压缩字符时,我们发现只要bbdd中有一个值为25的字节,jdbc驱动程序就会将其恢复为值15。值为15的字节也会恢复为15值,因此我们有一个不明确的值,我们不知道如何解决

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

有没有一种方法可以在不进行这种转换的情况下恢复字段的真实字节

请注意resultSet.getBinaryStream无法工作,因为它是一个字符列,我们无法以任何方式更改数据库。我们只能影响jdbc连接和java代码。

COMP-3是压缩数值的COBOL术语

关于IBM中端或大型机系统上的数值的快速课程。固定十进制数的描述具有精度、比例。所以一个5,2的数字的最大值是999.99

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

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

还要注意字符串“01234”将是x'f0f1f3f4'

对于那些存储在数据库中的字符列中的数据,这是没有意义的

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

如果您处理的是嵌入在字符串中的正分区小数,那么使用CAST转换并没有什么大不了的。负值要难一些

压缩小数是另一回事。在你的Java应用程序中可能最容易做到,快速的google会找到一些可能的解决方案

在SQL中执行此操作需要使用十六进制函数返回一个字符串,然后才能处理该字符串。您提到的列是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

最终的解决方案是对二进制文件进行强制转换,正如@Andrew所暗示的:

从表中选择“将字段转换为二进制大小(字节)”,其中


这样,我就可以使用ResultSet.getBinaryStream或ResultSet.getBytes读取值,它们获得的信息与数据库中存储的信息相同,并且中间没有奇怪的转换。

作为查询的一部分,也许可以尝试将char32列强制转换为一些兼容的类型,以便能够使用getBinaryStream.COMP-3映射到SQL DECIMAL数据类型,而SQL DECIMAL数据类型应该由JDBC驱动程序自动转换为java.math.BigDecimal-只需使用resultSet.GetBigDecimal即可。我正在读取一个包含压缩数字和混合字符串的字段,而批的格式取决于另一个值,因此我无法从sql中解释它,而不生成一个可怕的sql,这对mantain来说很困难。我将使用Andrew的选项将其转换为二进制,或者使用十六进制。我还不确定哪一个更合适。然后从java处理整个字节数组。