首页 > 解决方案 > 如何将 unicode 转换为 ebcdic CCSIDs-1025 并写入 db2

问题描述

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

解析 XML 后,我将数据保存到常规 char 数组中。当然,在我的系统中,没有用于 Unicode 转换的映射,并且该数组存储了正确的字节表示,但是像这样:“RњRRќRR •R RЎRR'Rћ PYPyPPŽPP RR•RРRЈR'R›RRR RR•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 和主机变量。我可能需要在绑定期间设置主机变量的编码吗?

谢谢!

标签: c++unicodedb2ebcdicdb2-zos

解决方案


@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 相同。


推荐阅读