2010-06-18 24 views
2

假設我創建了兩個不同的程序可執行文件,例如,在C++中。ODBC和NLS_LANG

由於某些原因,兩個程序內部的文本表示形式各不相同。假設第一個程序使用文本表示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的表示/從UTF-8到/從表示B到到/從UTF-8?

問候, /邁克爾

PS。由於程序通過ODBC連接,我不認爲他們現在應該關注NLS_LANG,因爲這是一個Orcacle特定的環境變量。

回答

0

您需要使用定義的UNICODE宏來構建您的應用程序(請參閱像sqltypes.h和sqlucode.h這樣的sql頭文件)。這將對通常映射到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與Oracle/NLS_LANG的關係。

+0

謝謝,我明白,這是一個可能的解決方案,以便ODBC API使用unicode編譯程序 - 即使程序本身都是非Unicode。他們只需要轉換到/從unicode。不過,我通常會選擇一個完整的unicode編譯解決方案,即所有內部文本表示都使用unicode。 所以如果程序完全unicode' - 那麼問題就會消失。據我所知 - 只有在使用非Unicode的ODBC API時,NLS_LANG纔會生效。 PS:這些程序必須在Windows和Unix上運行。 – 2010-06-22 09:28:17