Oracle sqlplus的乱码解决办法

先介绍一下shell所在的环境:
操作系统 Linux Suse 9 数据库 Oracle 9i

Suse的环境变量:
NLS_LANG=SIMPLIFIED CHINESE_CHINA.UTF8 (控制Oracle客户端应用程序使用的字符集)
LANG=zh_CN.gbk(操作系统的语言字符集)

Oracle服务器的字符集:UTF8(Oracle服务器端的字符集)


shell的执行方式:先用ftp工具将脚本以asc方式上传至Suse上,然后利用telnet工具登录Suse来运行shell。下面一段为原始shell,即执行结果出现乱码问题的代码。功能是通过调用存储过程,获得返回出参,并将出参值写到目标文件 DelProductInfoResult.txt中:
send_day=`sqlplus -s $db_conn_cmd <<EOF
set serveroutput on
set pagesize 0
set linesize 32767
set feedback off
DECLARE
ret1 varchar2(1000);
BEGIN
zxdbm_ismp.product_delete('${v_productid}',ret1);
DBMS_OUTPUT.PUT_LINE(ret1);
END;
/
exit;
EOF`


del_info=`echo $send_day|awk '{ print $1 }'`
echo "del_time:"$v_time
echo $del_info
echo $del_info>>$vac_product_path"/result/"$v_time"DelProductInfoResult.txt"


上面2段原始脚本被执行后:
telnet工具的屏幕上打印的变量del_info为:111100027100000000026|鎴愬姛|浜у搧锛?|涓氬姟锛?|浜у搧鎸囦护锛
同时,目标文件DelProductInfoResult.txt中的内容也为:111100027100000000026|鎴愬姛|浜у搧锛?|涓氬姟锛?|浜у搧鎸囦护锛

分析原因:Suse系统上的oracle客户端的NLS_LANG变量为:SIMPLIFIED CHINESE_CHINA.UTF8, 当存储过程zxdbm_ismp.product_delete('${v_productid}',ret1);执行后,通过sqlplus将返回值打印在telnet工具屏幕上,由于Suse的操作系统环境变量LANG=zh_CN.gbk,导致返回的中文信息写到telnet屏幕上时,ret1的值显示为乱码。即对于下面PL/SQL语句:
set serveroutput on
set pagesize 0
set linesize 32767
set feedback off
DECLARE
ret1 varchar2(1000);
BEGIN
zxdbm_ismp.product_delete('111100027100000000026',ret1);
DBMS_OUTPUT.PUT_LINE(ret1);
END;
/

【1】当SUSE的NLS_LANG为SIMPLIFIED CHINESE_CHINA.UTF8时,telnet到Suse后,sqlplus连上Oracle并执行上面的PL/SQL语句后,ret1的打印信息如下:
SQL> set serveroutput on
SQL> set pagesize 0
SQL> set linesize 32767
SQL> set feedback off
SQL> DECLARE
2 ret1 varchar2(1000);
3 BEGIN
4 zxdbm_ismp.product_delete('111100027100000000026',ret1);
5 DBMS_OUTPUT.PUT_LINE(ret1);
6 END;
7 /
111100027100000000026|鎴愬姛|浜у搧锛?|涓氬姟锛?|浜у搧鎸囦护锛?

【2】当SUSE的NLS_LANG为SIMPLIFIED CHINESE_CHINA.ZHS16GBK时,telnet到Suse后,sqlplus连上Oracle并执行上面的PL/SQL语句后,ret1的打印信息如下:
SQL> set serveroutput on
SQL> set pagesize 0
SQL> set linesize 32767
SQL> set feedback off
SQL> DECLARE
2 ret1 varchar2(1000);
3 BEGIN
4 zxdbm_ismp.product_delete('111100027100000000026',ret1);
5 DBMS_OUTPUT.PUT_LINE(ret1);
6 END;
7 /
111100027100000000026|成功|产品:1|业务:1|产品指令:0


乱码问题的解决思路:

经过将Suse的NLS_LANG变量更改为SIMPLIFIED CHINESE_CHINA.ZHS16GBK,该问题得到解决。
开头的原始shell脚本被执行后:
telnet工具的屏幕上打印的变量del_info为:111100027100000000026|成功|产品:1|业务:1|产品指令:0
同时,目标文件DelProductInfoResult.txt中的内容也为:111100027100000000026|成功|产品:1|业务:1|产品指令:0

但是,按照这修改操作系统的环境变量NLS_LANG来实现乱码问题的解决始终不是好的方法,这样的更改操作系统环境变量,会影响到运行在该系统上的其他应用程序的运行。

鉴于这样,就得来通过扩展shell脚本的功能代码,来适应在特定操作系统的环境变量下,没有乱码出现。

下面一段代码,通过判断操作系统NLS_LANG值,如果是UTF8,则先将变量del_info的值写到临时文件中,再通过iconv命令将临时文件的内容的编码方式由utf8转换为gb2312,以跟操作系统的LANG环境变量保持一致,再将转换编码方式后的临时文件的内容写到目标文件 DelProductInfoResult.txt中。这样,就在不更改操作系统NLS_LANG变量的情况下,实现乱码问题的解决:
if [ -d "$NLS_LANG" ]
then
echo "NLS_LANG not set!"
exit
else
echo "NLS_LANG:" $NLS_LANG
if [ "$NLS_LANG" = "SIMPLIFIED CHINESE_CHINA.UTF8" ]
then
del_info=`echo $send_day|awk '{ print $1 }'`
echo "del_time:"$v_time
echo $del_info
echo $del_info >$vac_product_path"/cc.temp"
iconv -f utf-8 -t gb2312 $vac_product_path"/cc.temp" >> $vac_product_path"/result/"$v_time"DelProductInfoResult.txt"
rm -f $vac_product_path"/cc.temp"
else
del_info=`echo $send_day|awk '{ print $1 }'`
echo "del_time:"$v_time
echo $del_info
echo $del_info >>$vac_product_path"/result/"$v_time"DelProductInfoResult.txt"
fi
fi
看过此文的读者还看过:
Oracle sqlplus的乱码解决办法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!有关 Oracle SQL*Plus 乱码的问题,我可以给您一些可能的解决方案。请尝试以下步骤来解决乱码问题: 1. 确保您的终端或客户端工具设置正确。在 Windows 环境下,可以在命令提示符中使用 `chcp` 命令检查当前的代码页设置,并确保它与数据库字符集一致。例如,如果数据库使用 UTF-8 字符集,则可以使用 `chcp 65001` 将代码页设置为 UTF-8。 2. 检查数据库字符集。您可以使用以下查询来确定数据库的字符集: ```sql SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET'; ``` 确保客户端工具和数据库字符集一致。 3. 检查会话字符集。在 SQL*Plus 中,可以使用以下语句来检查当前会话的字符集: ```sql SELECT value FROM nls_session_parameters WHERE parameter = 'NLS_CHARACTERSET'; ``` 如果会话字符集与数据库字符集不匹配,可以尝试使用以下命令将会话字符集设置为数据库字符集: ```sql ALTER SESSION SET NLS_CHARACTERSET = <数据库字符集>; ``` 例如: ```sql ALTER SESSION SET NLS_CHARACTERSET = 'UTF8'; ``` 如果需要修改客户端字符集,可以使用以下语句: ```sql ALTER SYSTEM SET NLS_LANG = <客户端字符集>; ``` 例如: ```sql ALTER SYSTEM SET NLS_LANG = 'AMERICAN_AMERICA.UTF8'; ``` 4. 检查操作系统环境变量。确保操作系统的语言和区域设置正确,并与数据库字符集匹配。在 Windows 环境下,可以在控制面板的“区域和语言选项”中进行设置。 5. 确保数据库中存储的数据是正确的字符集编码。如果数据库中的数据已经损坏或包含错误的字符集编码,显示乱码是正常的。 6. 如果以上步骤都没有解决问题,可能需要考虑升级或重新安装 Oracle 数据库以确保字符集设置正确。 请注意,这些解决方案可能会因您的具体环境而有所不同。如果问题仍然存在,请提供更多详细信息,以便我能够更好地帮助您解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值