`
jasonw68
  • 浏览: 153171 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Oracle 输出乱码

    博客分类:
  • SQL
阅读更多

先介绍一下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
分享到:
评论

相关推荐

    SQL-SERVER-64位配置ORACLE连接-中文乱码问题

    ### SQL-SERVER-64位配置ORACLE连接-中文乱码问题 在IT行业中,不同数据库之间的连接配置是一项常见的任务,特别是在需要实现跨平台数据交换的场景下。本文将详细介绍如何解决64位系统下的SQL Server连接Oracle...

    安装oracle中文乱码问题

    ### 安装Oracle时中文乱码问题解决方案 #### 背景介绍 在进行Oracle数据库安装的过程中,很多用户会遇到中文显示为乱码的问题。这一现象不仅降低了用户体验,还可能影响到系统的正常配置与管理。本文将详细介绍如何...

    Jdbc连接oracle远程数据库中文乱码解决

    Oracle数据库作为一款广泛应用的关系型数据库系统,其与Java应用程序的集成常常会遇到各种问题,其中之一就是字符编码导致的中文乱码问题。本文将深入探讨如何通过JDBC(Java Database Connectivity)连接Oracle远程...

    Oracle导出成csv格式后显示乱码的解决方法

    在Oracle数据库环境中,导出数据为CSV(Comma Separated Values)格式时,有时可能会遇到中文显示为乱码的问题。这通常与字符编码不匹配有关。以下是一套详细的解决步骤和相关知识点: 1. **字符编码问题**: CSV...

    oracle乱码问题解决

    总之,解决Oracle数据库的乱码问题需要深入理解字符集的工作原理,确保所有环节从输入、存储到输出都保持字符集的一致性。在处理中文数据时,选择支持汉字的字符集如GBK或UTF-8尤为重要,以确保数据的准确显示和处理...

    Oracle客户端PL/SQL 中文乱码解决

    然而,当用户在使用Oracle客户端进行PL/SQL开发时,经常遇到一个棘手的问题——中文乱码。这个问题通常出现在查询结果、日志输出或者交互式输入时,给数据库操作带来不便。本文将深入探讨这个问题,并提供解决方案。...

    Qt操作Oracle解决汉字乱码方案

    以上代码示例展示了如何在查询过程中处理字符串编码转换,以确保最终输出的中文数据不会出现乱码。 #### 总结 通过上述两种方法,可以有效地解决使用Qt操作Oracle数据库时遇到的汉字乱码问题。第一种方法较为简单...

    php pdo oracle中文乱码的快速解决方法

    在执行SQL查询时,确认SQL语句中没有使用Oracle客户端默认编码进行字符比较或者排序,以避免在结果集输出时产生乱码。 最后,解决乱码问题后,需要重启php-fpm服务使设置生效。可以通过以下命令重启服务: ```bash...

    如何解决Oracle EBS R12 - 以Excel查看输出格式为“文本”的请求时乱码

    在使用EBS R12时,有时用户可能会遇到一个问题,即当尝试以Excel格式查看输出为“文本”的并发程序请求时,显示的内容会变成乱码。这通常与字符编码设置和系统配置有关。下面将详细介绍这个问题的原因以及解决方案。...

    DatabaseHelper_oracle_c#Oracle_C#_ManagedDataAccess_oracle操作_

    5. OracleParameter:用于在OracleCommand中传递参数,无论是执行SQL语句还是存储过程,都可以通过这个对象传递输入、输出或输入/输出参数。 在"DatabaseHelper"这个类中,通常会封装这些组件,提供一些静态或实例...

    case乱码解决

    mysql 中case when 遇到乱码解决。查询语句中含有case引起中文乱码解决方法

    mybatis乱码的解决方法

    在使用MyBatis框架进行数据...同时,通过调试和日志输出,可以进一步定位乱码的具体来源,从而采取针对性的解决措施。总的来说,解决MyBatis乱码问题的关键在于确保数据传输的每个环节都使用一致且兼容中文的字符编码。

    drools4.0.7 utf-8中文乱码.doc

    此外,在Oracle 数据库中,输入编码为 GBK,输出编码为 UTF-8。因此,在读取规则字符串时,需要使用 UTF-8 的方式读入规则字符串。 Drools 4.0.7 中文乱码的问题可以通过使用 Janino 编译器、修改 ...

    Oracle数据库中ORDER BY排序和查询按IN条件的顺序输出

    本文将深入探讨`ORDER BY`子句在Oracle中的排序机制,以及查询时根据`IN`条件顺序输出的方法。 首先,`ORDER BY`用于指定查询结果的排序方式,可以基于一个或多个列进行升序(ASC)或降序(DESC)排序。然而,...

    Java中文乱码浅析及解决方案

    Java 中文乱码问题是一个常见的编程困扰,尤其对于处理中文字符的Java程序而言。这个问题通常源于字符编码的不一致,即不同环节采用的字符编码标准不统一。本文将深入探讨这一问题,并提供相应的解决方案。 首先,...

    解决linux下sqlplus 退格,回车乱码

    在Linux环境中,SQL*Plus是Oracle数据库系统的命令行接口,用于执行SQL语句和PL/SQL块。然而,用户在使用SQL*Plus时可能会遇到一些输入问题,比如退格键和回车键导致的乱码现象。这通常是因为终端不支持某些高级的...

    Oracle实用教程笔记

    SQL*Plus是Oracle提供的一个命令行界面工具,允许用户执行SQL语句、PL/SQL代码,并能提供查询结果的文本输出。通过SQL*Plus可以执行包括创建表、插入数据、更新记录以及查询数据等操作。它为数据库管理员和开发人员...

    查看oracle dmp字符集的小工具

    它可能解析Data Pump Export的输出,提取出相关的字符集信息,并以友好的方式展示给用户。这样,数据库管理员或开发人员就可以快速确定DMP文件的原始字符集,为后续的数据导入操作做好准备。 使用这样的工具可以...

    关于用oracle的dbms_xmldom导出xml文档编码格式UTF-8的问题总结

    ### 关于用Oracle的DBMS_XMLDOM导出XML文档编码格式UTF-8的问题总结 在处理Oracle数据库中使用DBMS_XMLDOM模块创建并导出XML文档时,经常会遇到有关文档编码格式的问题,尤其是如何确保导出的XML文档采用UTF-8编码...

    Mysql迁移Oracle方案

    - **乱码验证**:检查Oracle数据库中是否存在乱码问题,特别是针对中文或其他非英文字符。 综上所述,MySQL到Oracle的数据迁移涉及多个步骤和技术细节,需要严格按照上述流程操作,并在每个环节仔细核对,确保数据...

Global site tag (gtag.js) - Google Analytics