【问题标题】:DB2 to COBOL String Losing Line Feed and Carriage ReturnsDB2 到 COBOL 字符串丢失换行和回车
【发布时间】:2016-03-28 17:31:39
【问题描述】:

我正在尝试从表中获取一些数据。变量是 VARCHAR 30000,当我使用 COBOL EXEC SQL 检索它时,返回字符串但没有必要的(十六进制)换行和回车。我一次检查一个字符串,寻找 0A 或 0D 的十六进制值,但它们从未出现。

一旦将字符串填充到我的 cobol 变量中,LF 和 CR 似乎就会丢失。

想法?

【问题讨论】:

  • 您没有指定数据的来源,您确定该列包含 x'0A' 和 x'0D' 吗?如果您尝试使用其他工具检索数据,这些值是否存在?
  • 您知道,除非您包含那些与 CR 和 LF 相关的特定十六进制值作为数据,否则它们不会存储在 z/OS DB2 VARCHAR 中。是的?您不只是假设 z/OS 和 COBOL 有“字符串”,因为它们没有。
  • 为什么不寻找 ebcdic 换行符 (x'15' dec=21 ??)。大多数 Java 程序都乐于使用 ebcdic,并且会正确处理 ebcdic 新行
  • 如果存储为 EBCDIC,CR/LF 组合应为 x'0D25'。不知道是怎么存储的,怎么找回的,inspect是怎么做的等等,很难知道怎么回答,需要看相关代码。
  • 问题是我正在查看的特定记录实际上在数据中没有 CRLF,但我与之比较的那个记录确实存在。 CRLF 实际上存储在 DB2 VARCHAR 中(作为十六进制值)。感谢您的帮助。多么愚蠢的错误。

标签: sql db2 cobol


【解决方案1】:

我见过 CR 和 LF 在数据库数据中的情况。这些是有效字符,因此可以将它们存储在那里。

您是否尝试过使用其他工具或方法确认数据库中确实存在 CR 和 LF 字符?我的 Z 系列经验非常有限,所以我无法推荐选项。但是,Z 系列上必须有一些等效的 SSMS 和 SQL Server 才能查询 DB2 数据库。

查看这个关于查询 DB2 和清理 CR 和 LF 字符的 SO 链接。

DB2/iSeries SQL clean up CR/LF, tabs etc

【讨论】:

  • 当一个人说“它不在这里”让其他人问“你怎么能确定?”时,这是程序员 101 的信条。
【解决方案2】:

如果数据在大型机上检索时存储/转换为 ebcdic,您应该得到 EBCDIC 换行符 x'15' decimal=21 而不是0A 或 0D。

只有当您以 ASCII / UTF-8 检索数据时,您才会得到 0A 或 0D。


大多数 java 编辑器可以像编辑 ASCII(使用 \n)一样轻松地编辑 EBCDIC(使用 EBCDIC 换行符 x'15'),但不确定 Eclipse。

【讨论】:

    【解决方案3】:

    好吧,我相信这可能取决于方言(COBOL 和 DB2),但如果是我,我会在表定义中的 VARCHAR 上使用 FOR BIT DATA。您的问题还可能与为表所在的数据库定义的代码页有关。

    我经常将各种二进制、EBCDIC 和 Unicode 数据混合在同一个 VARCHAR FOR BIT DATA 列中,没有任何问题,而您要做的只是包括 CR 和 LF。我的方法适用于 DB2 z/OS 和 DB2 LUW。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2010-12-09
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      相关资源
      最近更新 更多