我正在使用一个新的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代码。
答案 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()读取值,获取存储在数据库中的相同信息,并且两者之间没有奇怪的转换。