未传递输入参数中的 PLSQL 特殊字符

PLSQL Special Character in input parameter is not being passed

请在下面找到我的函数:

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 返回值 = 1

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

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

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 位的 32 位 Oracle Windows)。

查看此 post 了解更多详情:

我才知道,你用的是Linux,不是Windows。使用 locale charmapecho $LANG 而不是 chcp 来获取终端的字符集。

Oracle 将 µ 的 ASCII 代码返回为 49845(在我的例子中)。然而,根据互联网上可用的 ASCII 图表中提到的,µ 的 ASCII 码是 230。因此,当转换为某个 "I dont know " 数字时,从数据库到客户端机器的 49845 ascii 代码肯定是。