无法从Oracle变量

时间:2017-07-03 20:21:12

标签: oracle unicode

我使用的是非全局设置用于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

由于全局数据库设置,这是否失败?如果是这样,是否有解决方法而不更改这些设置?

(我测试了我在其他问题中找到的一些解决方案,例如试验CASTTO_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 并没有因为积分而受到伤害 - 但如果他想要将其作为答案发布,我肯定会赞成并标记为正确。

*我假设"他"基于头像。抱歉,如果我弄错了。

1 个答案:

答案 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 建议我提供的相关设置:

  • Oracle版本: 11g(11.2.0.4.0) - 64位
  • NLS_CHARACTERSET WE8ISO8859P15
  • NLS_NCHAR_CHARACTERSET AL16UTF16
  • SQL Developer版本: 4.1.5.21
  • SQL Developer编码: UTF-8