请在下面找到我的功能:
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.
答案 0 :(得分:2)
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 charmap
或echo $LANG
代替chcp
来获取终端的字符集。
答案 1 :(得分:0)
Oracle将μ的ASCII代码返回为49845(在我的例子中)。但是,在互联网上提供的ASCII图表中,μ的ASCII码是230。所以肯定49845 ascii代码从数据库到客户端机器转换为一些“我不知道”的数字。