我的数据库有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
'
答案 0 :(得分:1)
N'κόσμε'
(或多或少)等同于CAST('κόσμε' AS NVARCHAR2(..))
使用N'κόσμε'
,您说"将字符串视为NVARCHAR"。如果您只编写'κόσμε'
,则该字符串将被视为VARCHAR
。但是,NLS_CHARACTERSET
为WE8ISO8859P15
,不支持希腊字符。因此,您将?
作为占位符。
您没有告诉我们您的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;
--'κόσμε'