gpt4 book ai didi

c++ - ODBC 和 NLS_LANG

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:02:14 30 4
gpt4 key购买 nike

假设我创建了两个不同的程序可执行文件,例如在 C++ 中。

出于某种原因,这两个程序的文本内部表示彼此不同。假设第一个程序使用文本表示 A 和另一个文本表示 B。它可以是特定的 8 位 ANSI 代码页、Unicode/UTF-8 或 Unicode/UTF-16 或其他。

现在每个程序都想与(数据库)服务器上的同一个数据库表进行文本通信(添加/检索数据)。每个程序都通过 ODBC 与数据库进行通信。所以程序不知道它们正在与哪个数据库系统通信。

在这种特定情况下,虽然数据库实际上是 Oracle RDMS 数据库,并且数据库服务器管理员已将数据库设置为使用 UTF-8。

在运行程序的系统上,有合适的 ODBC 驱动程序可用,以便程序可以通过 ODBC 进行连接。每个程序都会适本地处理 ODBC 数据类型 SQL_C_CHAR 并将其转换为其内部文本表示形式。我假设程序只能假设为 SQL_C_CHAR 文本返回特定编码。如果不是,则必须告知程序是哪种编码。

对于 Oracle,我知道 NLS_LANG环境变量可以在客户端上使用。我假设它会影响 ODBC 驱动程序(与 SQL_C_CHAR 相关)从特定编码(由 NLS_LANG 给出)转换为数据库的内部编码(在此示例中为 UTF-8),反之亦然。

如果运行我的程序的机器有 NLS_LANG,此设置将影响为 SQL_C_CHAR 返回的字节序列,因此我的程序不能突然假设为通过 SQL_C_CHAR 返回的文本采用特定编码。

是否可以设置 ODBC 连接(最好在运行时以编程方式),以便它适本地处理两个程序的文本转换,即从/到表示到/从 UTF-8 和从/到表示 B 到/来自UTF-8?

问候,/迈克尔

附言。由于程序是通过 ODBC 连接的,所以我认为现在应该对 NLS_LANG 做任何事情都不是一件好事,因为这是 Orcacle 特定的环境变量。

最佳答案

您需要使用定义的 UNICODE 宏来构建您的应用程序(请参阅 sql 头文件,如 sqltypes.h 和 sqlucode.h)。这会将通常映射到 SQLxxxA (ANSI) 的 SQLxxx 调用更改为 SQLxxxW,因此它们使用所谓的宽字符 API。这意味着您可以将 unicode(以及 UCS2 编码的数据)传递给 SQL API,并结合提取字符串列作为 SQL_WCHAR,您将从提取中获得宽数据。我可能错过了它,但我没有看到您提到平台(Windows 或 UNIX),如果例如您使用的是 unix 并且没有使用 unixODBC 驱动程序管理器,那可能会有很小的不同。 MS 站点上有关于 unicode 和 ODBC 的负载。

Using the Easysoft ODBC-Oracle Driver with Unicode Data 有一个关于 Oracle/Unicode/ODBC 的合理解释.它在 C 上下文中解释了 ODBC 和 Unicode wrt Oracle/NLS_LANG。

关于c++ - ODBC 和 NLS_LANG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3069341/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com