我正在开发一个新的 java 应用程序,该应用程序适用于 db2 中无法更改的旧数据库。在其中一张表中,有一个包含 comp3 字符的 char(32) 列。
我们使用 ibm db2 jdbc 类型 4 驱动程序阅读本专栏。当我们检查字节来解包字符时,我们发现只要 bbdd 中有一个值为 25 的字节,jdbc 驱动程序就会将其恢复为值 15。值为 15 的字节也会恢复为 15 值,因此我们有一个不明确的值,我们不知道如何解决。
阅读 ibm 文档后发现,读取字符串似乎会将它们从 ebcdic 转换为 ascii/unicode,这似乎是问题的根源。
有没有办法在不进行这种转换的情况下恢复字段的实际字节?
请注意 resultSet.getBinaryStream() 不起作用,因为它是一个 char 列,我们无法以任何方式更改数据库。我们只能影响jdbc连接和java代码。
最佳答案
COMP-3
是压缩数字的 COBOL 术语。
有关 IBM 中型或大型机系统上数值的快速类(class)。固定十进制数字用(精度,小数位数)描述。因此 (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'
将它们存储在数据库的字符列中是没有意义的。
理想情况下,您应该修复数据库,以便将数值存储在数字列中。接下来最好的方法是定义一个 View ,该 View 可以正确地将数据提取到其组成列中。
如果您正在处理嵌入字符串中的正分区小数,那么使用 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
关于java - 从 jdbc 读取 db2 char 字段的不明确字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44266114/