先介绍一下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的乱码解决办法
分享到:
相关推荐
包含termcap-1.3.1.tar.gz,readline-6.2.tar.gz,rlwrap-0.37.tar.gz包 libtermcap-2.0.8-47.i386.rpm readline-devel-5.2-13.fc9.i386.rpm...按照里面说明文档操作即可,可以解决sqlplus下面退格,方向键输入乱码问题
本篇文章将详细介绍如何解决在Linux环境下SQL*Plus出现的乱码问题。 首先,我们需要了解Linux系统的字符编码。Linux默认使用UTF-8作为系统编码,而SQL*Plus则可能根据Oracle数据库的字符集进行显示。如果两者不一致...
替换oracle解压之后的database文件中的filegroup2文件 路径 :database/stage/Components/oracle.jdk/1.6.0.75.0/1/DataFiles
oracle 使用sqlplus导入大sql文件,需熟悉linux命令,批量导入sql文件以及导入乱码解决方案
在Linux环境中,SQL*Plus是Oracle数据库系统的命令行接口,用于执行SQL语句和PL/SQL块。然而,用户在使用SQL*Plus时可能会遇到一些输入问题,比如退格键和回车键导致的乱码现象。这通常是因为终端不支持某些高级的...
通过以上步骤,你可以成功解决Linux下Oracle SqlPlus使用时的方向键乱码问题,提高你的工作效率。记住,保持系统更新和正确配置是避免这类问题的关键。如果你遇到其他问题,查阅官方文档或在线社区通常都能找到解决...
总之,解决Oracle导出CSV文件显示乱码的关键在于理解字符编码和数据解析的过程。通过正确设置文件的编码和应用正确的分隔符,可以确保数据在不同程序间顺利转换并保持可读性。如果上述方法无效,可能需要检查数据库...
综上所述,解决Red Hat 5.4上Oracle 11g Sqlplus的中文乱码问题需要综合考虑系统级别的中文支持、环境变量配置以及客户端终端的设置。按照上述步骤操作后,应该能有效解决在各种场景下遇到的中文乱码问题。
服务器为windows server 2003,正常安装完oracle客户端后,插入数据时,发现中文都是?。 异常: ...解决方法: 我的电脑—右击—属性—高级—环境变量—系统变量—新建 变量名:NLS_LANG 变量值:SIMPLI
在Linux环境中,SQL*Plus是Oracle数据库管理系统提供的一个命令行工具,用于交互式地执行SQL语句和PL/SQL块。然而,在某些情况下,用户可能会遇到一些输入问题,比如退格键不起作用或者上翻历史记录时显示乱码。这个...
通过上述方法,你应该能够解决SQL*Plus中的乱码问题,使删除键和方向键正常工作。在实际操作过程中,请根据你的具体系统环境进行相应的调整。如果问题依然存在,可能需要进一步排查硬件、驱动程序或其他软件兼容性...
### 解决Oracle XE中文乱码问题 #### 背景与问题概述 在使用轻量级数据库Oracle XE的过程中,部分用户可能会遇到中文字符显示为乱码的问题。这一问题通常发生在数据库设置不当或者字符集配置错误的情况下。中文...
本篇文章将详细解析三种解决Linux安装Oracle 11g乱码的方法。 方法一:调整Linux系统的字符集设置 1. 首先,确认当前Linux系统的字符集,可以通过`locale`命令查看: ``` locale ``` 2. 如果发现字符集不支持中文,...
以下是一份详细的解决此类问题的指南,旨在帮助你顺利进行Oracle安装并创建无乱码的数据库。 首先,我们要理解汉字乱码的根源。在Linux系统中,字符编码通常是UTF-8,而Oracle数据库默认可能使用的是其他字符集,如...
这里将告诉您Oracle中文乱码,字符集问题处理,具体实现方法: 1. 右键计算机,选择属性,增加环境变量 NLS_LANG:SIMPLIFIED CHINESE_CHINA.ZHS16GBK 2.进入注册表,依次单击HKEY_LOCAL_MACHINE –>...
本文主要针对"Oracle数据库使用sqlplus时的连接错误与方向键乱码解决"这一主题进行深入解析。 首先,让我们来看看连接错误。错误提示“ORA-12505: TNS:listener does not currently know of SID given in connect ...
### Linux + Oracle环境下解决无法使用Backspace键删除问题及上下键出现乱码 在Linux操作系统与Oracle数据库结合使用的环境中,可能会遇到一些常见的键盘输入问题,比如Backspace键无法正常工作,只能使用Delete键...
### Oracle客户端中文显示问题及解决方案 #### 问题背景与描述 在Linux环境下安装Oracle数据库时,如果默认的字符集设置为WE8ISO8859P1,将无法支持中文字符。具体表现为,在客户端录入中文数据时能够正常显示,但...
本文将深入探讨这一问题,并提供一套详细的解决方案,帮助读者理解和解决因字符集不匹配而导致的PL/SQL中文乱码现象。 ### PL/SQL中文乱码原因分析 PL/SQL中文乱码的根本原因在于数据库与应用程序(如PL/SQL ...