如何将 unicode 转换为 ebcdic CCSIDs-1025 并写入 db2

问题描述

我的问题是输入是一个带有 UTF-8 编码的 XML 文件
数据库使用 CCSIDs-1025 (DB2) 进行编码。
应用程序本身采用 windows-1251 编码。

解析 XML 后,我将数据保存到常规字符数组。当然,在我的系统中没有用于 Unicode 转换的映射,并且数组存储了正确的字节表示,但类似于: "RњRRќRR •R RЎRR'Rћ PYPyPPŽPP R R•RРRЈR'R›RRR R R•R›RR RRR€ RR™R†R"

这不是问题。 我可以将其转换为 windows-1251 并使用 ebcdic 将其正确写入 DB2 或在我的代码中工作。
但是!

是否可以在写入表之前直接将 unicode 转换为 EBCDIC?

我找到了一种有用的工具 ICU4C 并尝试将“Moscow” (Москва) 转换为 EBCDIC CCSIDs-1025。

        ```lang-cpp
        // CONVERTION USING ICU

        UChar source[] = { 0x041C,0x043E,0x0441,0x043A,0x0432,0x0430,0x0021,0x0000 };
        char target[100];
        UErrorCode status = U_ZERO_ERROR;
        UConverter *conv;
        int32_t     len;

        // set up the converter
        //! [ucnv_open]

        conv = ucnv_openCCSID(1154,UCNV_IBM,&status);
        //! [ucnv_open]
        assert(U_SUCCESS(status));

        // convert to EBCDIC-1154.
        len = ucnv_fromUChars(conv,target,100,source,-1,&status);
        assert(U_SUCCESS(status));
        ```

它再次正确转换。并且符号的代码对应一个目标CCSID。
\xCF \x9E \xAB \x9A \xAF \x77 \x4F - 这就是结果。 但是我如何存储结果并将其插入到具有正确映射的表中? 它仍然需要来自 windows-1251(我的应用程序编码)和 "Москва" 映射为 "ПћљЇwO" 的符号。我如何告诉 DB2 使用 CCSIDs-1025 中的字符。

我还在 C++ 应用程序中使用嵌入式 sql 和主机变量。 我可能需要在绑定期间设置主机变量的编码吗?

谢谢!

解决方法

@Dastin_DV 关于您关于嵌入式 SQL 和宿主变量的 CCSID 以及您的应用程序处理的数据编码方案的问题,我想在这里进一步解释。

在 Db2 for z/OS 应用程序中,一个 CCSID 与源代码相关联,一个或多个 CCSID 可以与您的应用程序操作的数据相关联。 Db2 与数据关联的 CCSID 称为应用程序编码方案。

有一些通用规则:

  • 对于包含 SQL 语句和 SQL 语句中的文字字符串的应用程序源代码,如果您使用的是 Db2 预编译器,则在预编译应用程序时使用 CCSID SQL 处理选项,在编译应用程序时指定相同的 CCSID应用;如果您使用的是 Db2 协处理器,请使用语言编译器来设置 CCSID。

  • 对于应用程序数据,例如通过主机变量和参数标记传递的值,在 SQL 语句中,使用以下一种或多种 Db2 机制来设置应用程序数据的 CCSID 值,这称为应用程序编码方案

    • 使用 ENCODING 绑定选项。2.c 此选项通常会产生最佳性能。
    • 使用带有 CCSID 选项的 DECLARE VARIABLE 语句覆盖特定宿主变量的 CCSID。
    • 通过指定 CURRENT APPLICATION ENCODING SCHEME 专用寄存器覆盖动态 SQL 中参数标记的 CCSID。 Db2 在执行语句时使用这个特殊寄存器的值
  • 对于在 SQL 语句之外引用的应用程序数据,使用编程语言的规则,在某些情况下,这些数据的 CCSID 与源代码的 CCSID 相同。