2017-07-03 54 views
1

我使用的是不是全局爲的Oracle數據庫爲Unicode設置 - 但我已經能夠使用Unicode字符在需要時使用NVARCHAR2數據類型這是必需的。無法從Oracle變量讀取Unicode字符

這對存儲在數據庫中的數據工作正常 - 但我目前的用例是一個臨時變量。對於這個問題的目的,下面舉例說明我的問題:

VAR TEST NVARCHAR2(50); 
DEFINE TEST = 'This string contains 「Unicode」 characters'; 

SELECT '&&TEST' AS TEST 
FROM DUAL; 

我希望這個輸出是:

This string contains 「Unicode」 characters 

但取而代之的則是:

This string contains ¿Unicode¿ characters 

這是失敗的由於全局數據庫設置?如果是這樣,有沒有改變這些設置的解決方法? (我測試了其他問題中找到的一些解決方案,例如試驗CASTTO_NCHAR,並將腳本保存在顯式編碼爲UTF-8的頁面上 - 但這些策略都沒有成功。認爲的事實,我使用的是局部變量,從存在的問題區分這一點)

後續評論

laubster要求的輸出:

SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET' 

那輸出是WE8ISO8859P15

亞歷克斯·普爾詢問了客戶端和字符設置。

客戶端是SQL Developer。操作系統是Windows 10,我不能完全肯定到哪裏尋找客戶端字符設置 - 但也許答案是一樣的結果從laubster的查詢:WE8ISO8859P15

在任何情況下,這可能是一個模擬點。戰略(我從未聽說過)戰略。

我想我得到了我需要的東西。它看起來並不像亞歷克斯·普爾是傷害了點 - 但如果他想*後,作爲一個答案,我一定會給予好評,並標記爲正確的。

*我假設「他」根據形象。道歉,如果我錯了。

+1

(你綁定變量聲明是一個紅鯡魚:你根本沒有使用它,因此只處理常規的VARCHAR2領域。)編輯你的問題從客戶端添加您的NLS_LANG設置,以及從SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER ='NLS_CHARACTERSET''的輸出。 – laubster

+1

這是哪個客戶端,操作系統和客戶端字符設置是什麼?如果使用[文本文字的'n'text''版本](https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF00218),會發生什麼? (不知道'var'是否支持這一點,但無論如何,你會在查詢中使用它。) –

+0

問題已在上述評論的後續內容中進行了編輯。 –

回答

0

問題

好吧,基於由亞歷克斯·普爾提供的資料,關鍵是使這項工作是N'text' notation for a text literal。回過頭來看看這個例子,我的問題上面:

VAR TEST VARCHAR2(50); 
DEFINE TEST = 'This string contains 「Unicode」 characters'; 

SELECT '&&TEST' AS TEST 
FROM DUAL; 

給出結果:

This string contains ¿Unicode¿ characters 

解決方案

N'text'策略:

SELECT N'&&TEST' AS TEST 
FROM DUAL; 

給出預期的結果:

This string contains 「Unicode」 characters 

在我現實世界的例子中,這個功能被包裝在一個CASE語句中,它增加了一點複雜性。如果我只在需要Unicode字符的行中使用N'text'表示法,它會觸發錯誤「ORA-12704:字符集不匹配」。使它工作,我不得不添加NELSE線非Unicode文本的前面還有:

SELECT 
    CASE 
    WHEN 1 = 1 THEN N'&&TEST' 
    ELSE N'(Some other output)' 
    END AS TEST_OUTPUT 
FROM DUAL; 

設置信息

在情況下,它是幫助他人在類似的情況,這裏的相關設置,亞歷克斯·普爾建議我提供:

  • Oracle版本:第11G(11.2.0.4.0) - 64位
  • NLS_CHARACTERSETWE8ISO8859P15
  • NLS_NCHAR_CHARACTERSETAL16UTF16
  • SQL Developer版本:4.1.5.21
  • SQL Developer的編碼:UTF-8