java - 从 jdbc 读取 db2 char 字段的不明确字符

标签 java jdbc db2

我正在开发一个新的 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/

相关文章:

java - 什么是修改后的构建器模式?

java - com.google.api.client.auth.oauth2.TokenResponseException : 400 Bad Request (Eclipse)

java - 使用 wasnull() 处理 java 结果集中的 null

postgresql - pgjdbc中prepareThreshold = 5有什么好处?

java - 使用动态模式查询而不使用字符串连接

database - Bluemix 本地 : How do I add an existing on-prem DB2 database as service?

java - 如何使 ArrayAdapter.getView() 在 ArrayList() 上工作?

java - 使用 JSTL 以嵌套方式设置 JSP 属性?

java - 读取输入流时 DB2 过早到达流末尾

c# - .NET 上的 DB2 连接速度慢