簡體   English   中英

10g和11g差異中的Oracle Unicode支持

[英]Oracle Unicode Support in 10g and 11g Differences

我遇到了一個我無法解釋的問題。 我有接受數字的代碼,使用NCHR獲取該數字的國家字符代碼,然后對其執行RAWTOHEX轉換。

它在10g中工作了好幾年。 當我們升級到11g時,它開始返回不同的值。 我將其歸納為幾句話,並創建了一個演示腳本:

SET SERVEROUTPUT ON;
DECLARE
  rawVar RAW(2000);
  nVar NVARCHAR2(1000);
BEGIN
  nVar :=  NCHR(1112);
  SELECT RAWTOHEX(nVar) INTO rawVar FROM DUAL;
  DBMS_OUTPUT.PUT_LINE('rawVar: ' || rawVar);
END;
/

當以10g執行時,輸出為“ 0458”。 在11g中(從同一台計算機使用相同的Oracle客戶端軟件),輸出為“ 00040058”。 依賴於輸出的上游過程預期為“ 0458”。

有趣的是(對我而言),如果我將nVar的定義更改為VARCHAR2而不是NVARCHAR2,則在11g上將得到“ 0458”作為輸出。

有人可以幫忙解釋一下為什么結果不同嗎? 我已經搜索了Oracle的發行說明和支持系統,但是沒有找到任何答案。

提前謝謝了。

這是Oracle 11 Change中的一個可怕的錯誤

nVar :=  NCHR(1112); 

nVar :=  CHR(1112 using nchar_cs);

事情將會再次發生。 根據Oracle文檔,這些表達式應該相同。 在Oracle 10中確實如此,但在11中卻不是。

兩個數據庫是否使用相同的字符集?

您能否在兩個實例中都運行此查詢:

select value 
  from nls_database_parameters 
 where parameter='NLS_NCHAR_CHARACTERSET';

僅當數據庫具有相同的字符集時,CHR和NCHR函數才會給出相同的結果。

RAWTOHEX返回一個字符值,但是您將其選擇為RAW,因此在那里會有一些隱式轉換。 然后,您嘗試使用DBMS_OUTPUT,這將需要將該RAW變量隱式轉換為字符串。

潛在地,您可以處理RAW值(即字節)或Character值(根據字符集/語言設置可能會轉換/翻譯的文本)或字符串中字節的十六進制表示形式。 您在數據庫中有哪些,並且想返回到應用程序? 然后,只需執行一次ONE轉換並明確進行即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM