假设我已经创建了两个不同的程序可执行文件,例如在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?
此致 /迈克尔
PS。由于程序是通过ODBC连接的,我认为它们现在应该关于NLS_LANG并不是很好,因为这是一个特定于Orcacle的环境变量。
答案 0 :(得分:0)
您需要使用定义的UNICODE宏来构建您的应用程序(请参阅sql头文件,如sqltypes.h和sqlucode.h)。这会将对SQLxxx的调用更改为通常映射到SQLxxxA(ANSI)到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以及Oracle / NLS_LANG。