我试图从表中取出一些数据。变量是VARCHAR 30000,当我使用COBOL EXEC SQL检索它时,字符串被返回,但没有必要的(十六进制)换行符和回车符。我一次检查字符串的一个字符,寻找0A或0D的十六进制值,但他们从未出现。DB2到COBOL字符串丢失换行符和回车换行
只要将字符串填充到我的cobol变量中,LF和CR似乎就会丢失。
想法?
我试图从表中取出一些数据。变量是VARCHAR 30000,当我使用COBOL EXEC SQL检索它时,字符串被返回,但没有必要的(十六进制)换行符和回车符。我一次检查字符串的一个字符,寻找0A或0D的十六进制值,但他们从未出现。DB2到COBOL字符串丢失换行符和回车换行
只要将字符串填充到我的cobol变量中,LF和CR似乎就会丢失。
想法?
我已经看到CR和LF在数据库中的数据。这些是有效的字符,因此可以将它们存储在那里。
你有没有试过,以确认是否真的在数据库CR和LF字符使用一些其他的工具或方法?我的Z系列的经验是相当有限的,所以我无法建议选择。但是,Z系列上必须有一些等效的SSMS和SQL Server才能查询DB2数据库。
查看此链接查询DB2并清除CR和LF字符。
这看起来像一个评论,而不是一个答案... –
当别人问“你不能在这里”,“你怎么确定?”时,这是程序员101的宗旨。 – Kennah
如果数据存储/ 转换为EBCDIC时主机上检索,你应该得到的EBCDIC换行字符X'15' 十进制=而非0A或0D 21。
只有当您检索在ASCII/UTF-8的数据,你会得到0A或0D。
大多数Java编辑器可以编辑EBCDIC(与EBCDIC换行字符X'15' )一样容易,ASCII(含\ n)的,不知道关于Eclipse虽然。
嗯,我认为这可能是依赖于方言(包括COBOL和DB2),但如果是我,我将用在表中定义的VARCHAR位数据。您的问题也可能与为该表所在的数据库定义的代码页相关。
我经常在同一个VARCHAR FOR BIT DATA列中混合存储各种二进制,EBCDIC和Unicode数据,而且没有任何问题,并且您尝试执行的操作仅包括CR & LF。我的方法适用于DB2 z/OS和DB2 LUW。
我希望这会有所帮助。
您不指定数据的来源,您确定该列包含x'0A'和x'0D'?如果您尝试使用其他工具检索数据,那么这些值是否存在? – cschneid
您知道,除非将与CR和LF相关的那些特定十六进制值包含为数据,否则它们将不会存储在z/OS DB2 VARCHAR中。是?你不只是假设z/OS和COBOL有“字符串”,因为它们不是。 –
为什么不寻找ebcdic New-Line charachter(x'15'dec = 21 ??)。大多数java程序都很乐意使用ebcdic,并会正确处理ebcdic新行 –