Oracle Unicode支持10g和11g的差异

时间:2009-08-20 16:51:54

标签: oracle

我遇到了一个我尚未解释的问题。我有一个带有数字的代码,使用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执行时,ouptut为“0458”。在11g(来自同一台计算机并使用相同的Oracle客户端软件)中,输出为“00040058”。依赖于输出的上游进程期待“0458”。

有趣的是(对我来说),如果我将nVar的定义更改为VARCHAR2而不是NVARCHAR2,我将获得“0458”作为11g的输出。

有人可以帮助解释为什么结果不同吗?我搜索了Oracle的发行说明和支持系统,但没有找到任何答案。

非常感谢提前。

3 个答案:

答案 0 :(得分:1)

这是Oracle 11中的一个可怕的错误 变化

nVar :=  NCHR(1112); 

nVar :=  CHR(1112 using nchar_cs);

事情会再次奏效。 根据Oracle文档,这些表达式应该是相同的。在Oracle 10中,这是事实,但不是在11中。

答案 1 :(得分:0)

两个数据库是否使用相同的字符集?

您可以在两个实例中运行此查询:

select value 
  from nls_database_parameters 
 where parameter='NLS_NCHAR_CHARACTERSET';

如果数据库具有相同的字符集,CHR和NCHR函数将只给出相同的结果。

答案 2 :(得分:0)

RAWTOHEX返回一个字符值,但是你将它选择为RAW,因此会有一些隐式转换。然后你试图使用DBMS_OUTPUT,它需要隐式地将该RAW变量转换为字符串。

您可以处理RAW值(即字节)或字符值(可能根据字符集/语言设置转换/转换的文本)或字符串中字节的十六进制表示。您在数据库中拥有哪些,​​以及您希望返回到应用程序?然后只做一次转换并明确地做。