【问题标题】:PLSQL Special Character in input parameter is not being passed输入参数中的 PLSQL 特殊字符未传递
【发布时间】:2017-10-31 21:43:57
【问题描述】:

请在下面找到我的功能:

CREATE OR REPLACE FUNCTION TESTER_TESTING (    P_STRING         IN VARCHAR2) 
RETURN NUMBER IS
BEGIN
Dbms_Output.Put_Line('P_STRING:'||P_STRING);
return 1;
END TESTER_TESTING;
/

当我使用 sqlplus 执行时:

DECLARE 
  RetVal NUMBER;
  P_STRING VARCHAR2(32767);

BEGIN 
  P_STRING := '006µ-540';
  RetVal := VISION.TESTER_TESTING ( P_STRING );
  DBMS_OUTPUT.Put_Line('RetVal = ' || TO_CHAR(RetVal));
  DBMS_OUTPUT.Put_Line('');
COMMIT; 
END; 
/

输出是: P_STRING:006??-540 RetVal = 1

请告知为什么特殊字符没有被传递以及如何修复它。

-Oracle Version: 11g
-Linux: RHEL 7.2
-Script executed using sqlplus.

【问题讨论】:

  • 使用 Toad 执行时。它正确地传递了值。

标签: oracle plsql oracle11g sqlplus


【解决方案1】:

SQL*Plus 从命令行继承字符编码。您可以通过chcp进行咨询。

在启动 sqlplus 之前,您必须相应地设置 NLS_LANG 参数,例如

C:\>chcp
Active code page: 850

C:\>SET NLS_LANG=.WE8PC850    
C:\>sqlplus ...

当然它也可以反过来工作,例如

C:\>echo %NLS_LANG%
NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252

C:\>chcp 1252
Active code page: 1252

C:\>sqlplus ...

NLS_LANG 也可以在注册表中设置,参见HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG(对于 64 位),resp。 HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG(适用于 64 位 Windows 上的 32 位 Oracle)。

查看此帖子了解更多详情:OdbcConnection returning Chinese Characters as "?"

我刚刚看到,您使用的是 Linux,而不是 Windows。使用locale charmapecho $LANG 而不是chcp 来获取终端的字符集。

【讨论】:

  • 嗨,您所解释的内容适用于 Windows,但我在 Linux 中仍然面临同样的问题。 $LANG = en_US.UTF-8 并且我们的 Oracle 数据库具有 AMERICAN_AMERICA.AL32UTF8。请指教。感谢您的宝贵时间。
  • 可能你的终端程序不支持。检查那里的设置。
  • 对于终端程序,我们使用 PuTTY,其中我们提到了 UTF-8 作为远程字符集。
  • 此外,当使用 sqlldr 时,我们使用以下语法:“load data CHARACTERSET UTF8 infile.....”它正确识别并从同一终端程序和 linux 服务器正确加载数据。
  • 供参考:link
【解决方案2】:

Oracle 将 µ 的 ASCII 代码返回为 49845(在我的情况下)。然而,根据互联网上可用的 ASCII 图表中所述,µ 的 ASCII 代码为 230。所以当转换为一些“我不知道”的数字时,肯定有 49845 个 ascii 代码来自数据库到客户端机器。

【讨论】:

  • ASCII 是 7 位代码,根本不包含 µ
  • 我推荐了asciitable.com。它在扩展的 ascii 代码下提到。但是 49845(从 oracle 返回)肯定是我不明白的其他东西
  • 49845 是以 UTF-8 编码的µ,参见Micro Sign U+00B5
  • 感谢@WernfriedDomscheit。那么我应该认为这种编码不会在客户端机器上被识别吗?
  • 同样的问题,你必须通过NLS_LANG 告诉客户端应该使用哪个字符集。
猜你喜欢
  • 2018-03-29
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
相关资源
最近更新 更多