Oracle PLSQL相当于ASCIISTR(N' str')

时间:2016-06-20 13:13:17

标签: oracle unicode plsql

我的数据库有NLS_LANGUAGE:AMERICAN / NLS_CHARACTERSET:WE8ISO8859P15 / NLS_NCHAR_CHARACTERSET:AL16UTF16;我的 Windows>中的NLS_LANG设置为AMERICAN_AMERICA.WE8MSWIN1252性状>高级系统设置>先进>环境变量 - 希望它适用于我的PLSQL Dev。

我使用ASCIISTR来获取异形字符的unicode编码值,如下所示:

SELECT ASCIISTR(N'κόσμε') FROM DUAL;

结果

ASCIISTR(UNISTR('\03BA\1F79\03...
---------------------------------
\03BA\1F79\03C3\03BC\03B5

看起来像N'表示字符串是unicode,因为如果我没有指定它,我就会错误编码。

SELECT ASCIISTR('κόσμε') FROM DUAL;

结果

ASCIISTR('??SµE')
--------------------
??s\00B5e

这是什么' N'代表?我如何在PLSQL中调用它?

我打算在pl / sql变量上使用它来编码这样的exotice字符:

DECLARE 
  l_in VARCHAR2(2000);
  l_ec VARCHAR2(2000);
  l_dc VARCHAR2(2000);
BEGIN 
  l_in := 'κόσμε';
  execute immediate 'select ASCIISTR(N'''||l_in||''') from dual'  into l_ec;
  DBMS_OUTPUT.PUT_LINE(l_ec);

  select unistr(l_ec) into l_dc from dual;
  DBMS_OUTPUT.PUT_LINE (l_dc);
END;

但是我得到了

??s\00B5e
??sµe

好像我在上面的第二个案例中,没有' N'

2 个答案:

答案 0 :(得分:1)

N'κόσμε'(或多或少)等同于CAST('κόσμε' AS NVARCHAR2(..))

使用N'κόσμε',您说"将字符串视为NVARCHAR"。如果您只编写'κόσμε',则该字符串将被视为VARCHAR。但是,NLS_CHARACTERSETWE8ISO8859P15,不支持希腊字符。因此,您将?作为占位符。

您没有告诉我们您的NLS_NCHARACTERSET设置,很可能是支持Unicode。

顺便说一句,你不必select ... from dual,只需像

那样写
l_ec := ASCIISTR('κόσμε');
PL / SQL中的

您的本地 NLS_LANG值是多少,即在您的客户端?最有可能的是它与SQL * Plus的字符编码不匹配。有关详细信息,请参阅此答案:OdbcConnection returning Chinese Characters as "?"

答案 1 :(得分:0)

我(遗憾地)在PLSQL decode NVARCHAR2 from BASE64 to UTF-8中发现 DBMS_OUTPUT不支持NVARCHAR2数据类型 。因此我不能用它来调试。

然后我可以做以下测试:

-- encoding
CREATE OR REPLACE FUNCTION my_ec(l_in nvarchar2) RETURN varchar2 is
    l_out varchar2(32000);
BEGIN    
    l_out := asciistr(l_in);
    return l_out;  
END;
/

-- decoding
CREATE OR REPLACE FUNCTION my_dc(l_in varchar2) RETURN nvarchar2 is
    l_out nvarchar2(32000);
BEGIN 
    l_out := unistr(l_in);
    return l_out;
END;
/

预期结果!

select my_ec(N'κόσμε') from dual;
--'\03BA\1F79\03C3\03BC\03B5'
select my_dc('\03BA\1F79\03C3\03BC\03B5') from dual;
--'κόσμε'
select my_dc(my_ec(N'κόσμε')) from dual;
--'κόσμε'