2010-03-25 20 views
2

我正在從使用異構服務(通過ODBC)訪問SQL Server上的數據的VMS上的Oracle將數據遷移到通過Oracle Gateways訪問SQL Server的Oracle上dg4msql)。 Oracle VMS數據庫使用了WE8ISO8859P1字符集。 AIX數據庫使用WE8MSWIN1252。根據sp_helpsort,SQL Server數據庫使用「Latin1-General,不區分大小寫,區分變音,對kanatype不敏感,對Unicode數據不敏感,對非Unicode數據,代碼頁1252的SQL Server排序次序爲52」。 SQL Server數據庫使用nchar/nvarchar或所有字符串列。Oracle網關,SQL Server和Application Express的字符集問題

在Application Express中,某些情況下會出現額外字符,例如123顯示爲%001%002%003。在sqlplus中,事情看起來不錯,但如果我使用Oracle函數(如initcap),當查詢sql server數據庫(使用數據庫鏈接)時,我會看到字符串每個字母之間顯示的空格。這在舊配置下不會發生。

我假設問題是nchar中有額外的字節,Oracle中的字符集無法將其轉換。看來,ODBC解決方案不支持nchars,所以必須將它們轉換回char,並且它們顯示正常。我只需要查看sql服務器數據,所以我打開任何解決方案,如鑄造,但我還沒有找到任何工作。

有關如何處理此問題的任何想法?我應該在Oracle中使用不同的字符集嗎?如果是這樣,是否適用於所有模式,因爲我只關心其中的一個。

更新:我想我可以簡化這個問題。 SQL Server表使用nchar。從表中選擇轉儲(列)返回值Typ = 1 Len = 6:0,67,0,79,0,88當值爲'COX'時,無論從遠程鏈接選擇到sql server,轉換字面值'COX'到nvarchar,或作爲nvarchar複製到Oracle表中。但是當我選擇列本身時,只有在從遠程sql服務器鏈接中選擇時纔會出現額外的空格。我不明白爲什麼轉儲會返回相同的東西,但不使用轉儲會顯示不同的值。任何幫助表示讚賞。

回答

4

有SQL Server的特定版本的Oracle網關和NCHAR之間的不兼容。解決方案是在SQL Server端創建視圖,將nchars轉換爲varchars。然後,我可以通過網關從視圖中進行選擇,並正確處理字符集。

+0

我會添加找到適當的排序規則(可能來自Oracle NLS Lang FAQ),並在COLLATE 的視圖中明確定義翻譯。 – 2010-06-02 03:27:52

+0

這裏有任何幫助嗎? :) http://stackoverflow.com/questions/36393449/special-characters-in-oracle-nclob – 2016-05-03 13:39:58

0

你可能會感興趣的Oracle NLS Lang FAQ

+0

是的,這是很好的閱讀,但它沒有討論如何通過Oracle網關連接處理SQL Server nchar數據。 – 2010-03-29 13:14:52