Ambiguos字符从jdbc

时间:2017-05-30 15:20:11

标签: java jdbc db2

我正在使用一个新的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代码。

2 个答案:

答案 0 :(得分: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'

将那些存储在数据库中的字符列中没有意义。

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

如果您正在处理嵌入字符串中的正分区十进制小数,那么使用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

答案 1 :(得分:0)

最终的解决方案是@Andrew暗示的二进制文件:

从表中选择强制转换(字段为二进制(大小,以字节为单位))...

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