当前位置: 首页 > 知识库问答 >
问题:

Ambiguos字符从jdbc读取db2 char字段

毋承基
2023-03-14

我正在使用一个新的 java 应用程序,该应用程序适用于 db2 中无法更改的旧数据库。在其中一个表中,有包含 comp3 字符的 char(32) 列。

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

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

有没有办法不用这种转换就能恢复字段的实字节?

请注意,resultSet.getBinary Stream()不起作用,因为它是一个char列,我们不能以任何方式更改数据库。我们只能影响jdbc连接和java代码。

共有2个答案

王经赋
2023-03-14

正如@Andrew暗示的那样,最终的解决方案将是强制转换为二进制:

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

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

班凌
2023-03-14

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'

将这些存储在DB中的字符列中是没有意义的。

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

如果您正在处理嵌入在字符串中的正分区十进制,那么使用 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
 类似资料:
  • 问题内容: 有没有一种方法可以从用户输入中读取一个字符?例如,他们在终端上按一个键,然后将其返回(类似)。我知道Windows中有一个功能,但是我想要一些跨平台的功能。 问题答案: 以下是指向网站的链接,该网站说明了如何在Windows,Linux和OSX中读取单个字符:http : //code.activestate.com/recipes/134892/

  • 问题内容: 给定一个不太长的字符串,逐行读取字符串的最佳方法是什么? 我知道你可以做: 另一种方法是在eol上获取子字符串: 还有其他更简单的方法吗?我对上述方法没有任何问题,只是想知道你们中是否有人知道一些看起来更简单,更有效的方法? 问题答案: 您也可以使用String方法: 这使您可以方便地将所有行排列在一起。 我不知道拆分的性能。它使用正则表达式。

  • get() 是 istream 类的成员函数,它有多种重载形式(请 猛击这里了解详情),不过本文只介绍最简单最常用的一种: int get(); 此函数从输入流中读入一个字符,返回值就是该字符的 ASCII 码。如果碰到输入的末尾,则返回值为 EOF。 EOF 是 End of File 的缩写。istream 类中从输入流(包括文件)中读取数据的成员函数,在把输入数据都读取完后再进行读取,就会返

  • 所谓字符串,指的就是字符的序列或者“串”。我们要在字符串上执行的第一个操作是提取所有字符中的一个。C++使用方括号([和])执行该操作: apstring fruit = "banana"; char letter = fruit[1]; cout << letter << endl; 表达式fruit[1]表明我们要从字符串变量fruit中取得编号为1的字符,并将结果保存在字符变量letter

  • 问题内容: 我有一个在GlassFish 3上运行的Java Web应用程序和在MySQL上的JPA(EclipseLink)上运行。我面临的问题是,如果使用该方法将实体保存到数据库中,则字段将丢失完整性;显示而不是某些字符。 服务器,页面和数据库配置为使用。 发布表单数据后,下一页将正确显示数据。此外,它在NetBeans中似乎“调试”当前实体的属性也存储了正确的值。如果可以信任NetBeans

  • 我有一个PostGIS数据库和一个基于HikariCP构建的客户端,用于从数据库中读取数据。我的客户可以在一些机器上毫无问题地读取数据。然而,在其他一些机器上,客户机被卡住,不能读取任何数据,抛出套接字超时异常。 在客户端在数据库端抛出之前,我监视了表。上面查询的相应行有和。此外,数据库服务器记录了指示连接丢失的消息。 版本 PostGIS-jdbc: 2.2.1 (postgresql jdbc