我使用的是非全局设置用于Unicode的Oracle数据库 - 但我已经能够使用NVARCHAR2
数据类型根据需要使用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
由于全局数据库设置,这是否失败?如果是这样,是否有解决方法而不更改这些设置?
(我测试了我在其他问题中找到的一些解决方案,例如试验CAST
和TO_NCHAR
,以及将脚本保存在明确编码为UTF-8的页面上 - 但没有这些策略是成功的。我认为我使用局部变量的事实将其与现有问题区分开来。)
laubster 要求输出:
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET'
该输出为WE8ISO8859P15
。
Alex Poole 询问客户端和角色设置。
客户端是SQL Developer。操作系统是Windows 10.我不完全确定在哪里查找客户端字符设置 - 但答案可能与 laubster 查询的结果相同:{{ 1}}。
无论如何,这可能是一个有争议的问题。 WE8ISO8859P15
策略(我之前从未听说过)工作过。
我想我已经得到了我需要的东西。看起来 Alex Poole 并没有因为积分而受到伤害 - 但如果他想要将其作为答案发布,我肯定会赞成并标记为正确。
*我假设"他"基于头像。抱歉,如果我弄错了。
答案 0 :(得分:0)
好的,根据 Alex Poole 提供的信息,开展这项工作的关键是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:字符集不匹配"。为了使它工作,我不得不在N
行的非Unicode文本前面添加ELSE
:
SELECT
CASE
WHEN 1 = 1 THEN N'&&TEST'
ELSE N'(Some other output)'
END AS TEST_OUTPUT
FROM DUAL;
如果它对类似情况下的其他人有帮助,这里有 Alex Poole 建议我提供的相关设置:
NLS_CHARACTERSET
: WE8ISO8859P15 NLS_NCHAR_CHARACTERSET
: AL16UTF16