`

oracle 字符乱码

 
阅读更多

文章来源http://blog.csdn.net/nini1109/article/details/4158796
RedHat linux AS4.0安装了oracle10g,同时创建数据库实例sc,后来又用dbca建立一个数据库实例st,发现在oracle系统用户下用sqlplus连接st实例时出现乱码,应该是中文无法显示造成的,但连接sc实例时无乱码,显示英文。上网搜集了一下资料,修改了oracle系统用户的环境变量在.bash_profile中新增了以下内容解决:

export NLS_LANG=AMERICAN_AMERICA.UTF8
export LANG=en_US.UTF-8

分析原因:

引用网上帖子:

oracle字符集问题一般可以分为三类: 数据库字符集, sqlplus的字符集(客户端字符集), 终端程序的字符集(非oracle的)。

1、数据库字符集。
        数据库字符集是所有字符问题的核心,只有数据库本身的字符集正确了,客户端的字符集才可能正确。这里只的客户端包括sqlplus以及我们自己读数据库的应用程序。
     在定位问题时,我们需要先看看数据库当前是什么字符集。
    1)查询数据库字符集
       select * from nls_database_parameters
    其中 nls_language表示了显示方式, 就是sqlplus的程序的显示字体,有SIMPLIFIED CHINESE,American america
   其中  nls_characterset是字符集设定, 常用的一些字符集有UTF8,US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK, AL32UTF8
   2)修改数据库字符集
       当发现数据库字符集不正确时,如我们期望时GBK的,而数据库当前是其他的,从而引起中文乱码。这时我们需要修改数据库字符集。步骤如下:
     $sqlplus /nolog
  SQL>conn / as sysdba;
  若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器,然后执行以下命令:
  SQL>STARTUP MOUNT;
  SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
  SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
  SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
  SQL>ALTER DATABASE OPEN;
  SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
  SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;
  SQL>SHUTDOWN IMMEDIATE;
  SQL>STARTUP

2 客户端字符集
      如果服务器端的字符集是正确的,而在客户端下,如sqlplus仍然不能正确显示中文,这一般是由于服务器端的字符集设定与客户端的字符集设定不同造成的。只要将两者修改一致就可以解决问题。
    1)查询客户端字符集
    select * from nls_instance_parameters
    客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter,
    表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
        select userenv('language') from dual;
    会话字符集环境 select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。 
    客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件
    字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。  或者.zhs16gbk。注意zhs16gbk前面那个点是必须的哦!!

   2) 修改客户端字符集
oracle 的sqlplus会去读取OS中环境变量下的nls_lang信息(关键在这里,通过以上命令查看

select * from nls_database_parameters 显示

NLS_LANGUAGE                   AMERICAN                               
NLS_TERRITORY                  AMERICA                                
NLS_CURRENCY                   $   

 

select * from nls_instance_parameters 显示

NLS_LANGUAGE                   SIMPLIFIED CHINESE                     
NLS_TERRITORY                  CHINA                                  
NLS_SORT                                                              
NLS_DATE_LANGUAGE                                                     
NLS_DATE_FORMAT                                                       
NLS_CURRENCY     

 select * from nls_session_parameters 显示  

NLS_LANGUAGE                   SIMPLIFIED CHINESE                     
NLS_TERRITORY                  CHINA                                  
NLS_CURRENCY                   RMB  

 

也就是说会话字符集与终端字符集一致,而与数据库字符集设置不一致。

另一个数据库实例sc

数据库字符集

select * from nls_database_parameters 显示

NLS_LANGUAGE                   AMERICAN                               
NLS_TERRITORY                  AMERICA                                
NLS_CURRENCY                   $   

select * from nls_instance_parameters 显示

NLS_LANGUAGE                   AMERICAN                               
NLS_TERRITORY                  AMERICA                                
NLS_SORT                                                              
NLS_DATE_LANGUAGE                                                     
NLS_DATE_FORMAT                                                       
NLS_CURRENCY    

 

在linux下

 select * from nls_session_parameters 显示  

NLS_LANGUAGE                   AMERICAN                               
NLS_TERRITORY                  AMERICA    

用TOD 在windows下显示

NLS_LANGUAGE                   SIMPLIFIED CHINESE                     
NLS_TERRITORY                  CHINA                                  
NLS_CURRENCY                   RMB  

这个我还搞不明白为什么windows与linux会话字符集为什么不一样。

更搞不明白的是为什么两个数据库实例用同一个系统用户查询的,也就是说环境变量是一样的,但查询结果终端字符集为什么会不一样?初步分析(当然不一定对,欢迎指正)是两个数据库实例的参数文件不一致引起的,因为alter session>环境变量>注册表>参数文件,也就是说因为环境变量没有设置,但sc与st数据库实例参数文件不同,但是参数文件在什么地方设还不清楚,有高手欢迎指点!


但基本上问题锁定是因为终端字符集与数据库字符集不一致引起,在用户的环境变量中增加

export NLS_LANG=AMERICAN_AMERICA.UTF8
export LANG=en_US.UTF-8

问题解决

再次查看客户端字符集

select * from nls_instance_parameters 还是显示

NLS_LANGUAGE                   SIMPLIFIED CHINESE                     
NLS_TERRITORY                  CHINA                                  
NLS_SORT                                                              
NLS_DATE_LANGUAGE                                                     
NLS_DATE_FORMAT                                                       
NLS_CURRENCY     

但

 select * from nls_session_parameters 显示  

NLS_LANGUAGE        AMERICAN

NLS_TERRITORY         AMERICA

NLS_CURRENCY         $

看来只要本次会话字符集正确就没问题了,经过验证确实如此,用

alter session set NLS_LANGUAGE=‘AMERICAN’后本次会话也不会出现乱码的。
)
NSL_LANG包括三个部分(语言_地区.字符集)就是V$NLS_PARAMETERS表中的NLS_LANGUAGE,NLS_TERRITORY,NLS_CHARACTERSET
例如可以在cmd中键入
set nls_lang="Simplified chinese_china.utf8"
set nls_lang="american_america.us7ascii"
set nls_lang="american_america.zhs16gbk"
set nls_lang="Simplified chinese_china.zhs16gbk"
set nls_lang=".utf8"
set nls_lang=".zhs16gbk"
set nls_lang=".us7ascii"

unix下类似, 不过nls_lang要大写NLS_LANG, 在.profile或这.bash_profile(根据你用的shell)里更改NLS_LANG可以长久保持环境变量值.

3、终端字符集
    如果数据库字符集和sqlplus的字符集一致, 还是不能正确显示了, 那很可能就是你的终端应用程序的字符集不支持了. 例如你用bash登陆sqlplus, 如果你的bash是个小字符集, 那么就不能正常显示了.linux修改bash的字符集, 可以先键入locale, 看有哪些环境变量, 再用export设置.

分享到:
评论

相关推荐

    linux 下oracle中文乱码字符集设置

    Linux 下 Oracle 中文乱码字符集设置 Linux 下的 Oracle 数据库在导入数据库时出现中文乱码问题,这是因为 Oracle 数据库中的字符集格式不支持中文。解决方法是通过修改字符集格式,将其修改成支持中文的格式,这样...

    jdbc连接oracle字符集不同出现乱码

    ### JDBC 连接 Oracle 字符集不同导致乱码问题解析及解决方案 #### 问题背景 在使用 JDBC(Java Database Connectivity)连接 Oracle 数据库时,可能会遇到一个常见的问题:从远程 Oracle 数据库获取的数据出现乱码...

    oracle 字符集乱码解决

    由于历史的原因,早期的oracle没有中文字符集(如oracle6、oracle7、oracle7.1),但有的用户从那时起就使用数据库了, 并用US7ASCII字符集存储了中文,或是有的用户在创建数据库时,不考虑清楚,随意选择一个默认的...

    oracle数据库字符集 无法修改数据库字符集 乱码

    本文将深入探讨Oracle数据库字符集的概念、重要性、修改过程及其潜在问题,特别是当尝试修改数据库字符集时遇到的乱码问题。 ### Oracle数据库字符集概述 Oracle数据库字符集是指用于表示数据库中所有字符数据的...

    oracle数据库乱码问题解决

    在使用Oracle数据库的过程中,可能会遇到字符显示异常的问题,通常被称为“乱码”。这种情况会影响到数据的正确读取与处理,进而影响到业务流程的正常进行。本文将针对Oracle数据库中的乱码问题进行详细的分析,并...

    Oracle字符集专题

    "Oracle字符集(4).txt"可能涵盖字符集问题的诊断和修复,如如何识别和处理乱码问题,以及如何通过ALTER DATABASE命令更改数据库字符集。 最后,"Oracle字符集(5).txt"可能涉及数据导入导出与字符集的关联,如...

    ORACLE_CHAR_ToolS(ORACLE字符转换)

    Oracle数据库在处理字符集时,有时会出现数据乱码的问题,这通常是由于字符集不匹配或者在数据传输过程中编码转换不当导致的。"ORACLE_CHAR_ToolS"是一个专门针对这类问题的工具集合,它包含了两个注册表文件,用于...

    Linux上安装Oracle汉字乱码完整解决方案

    总之,解决Linux上Oracle汉字乱码问题涉及多个层面,包括安装JDK、更新字体配置以及正确设置数据库和系统的字符集。通过本文提供的方法,可以有效地避免和解决这个问题,让Linux上的Oracle数据库在处理中文数据时...

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

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

    链接服务器-SQL Server连接Oracle(乱码配置,无需修改数据库编码)

    网上基本找不到,sqlserver2012版本链接oracle乱码问题解决实测版。

    oracle字符集的查看和client字符集的修改

    ### Oracle字符集的查看与客户端字符集的修改 #### 一、Oracle字符集的基本概念 在Oracle数据库系统中,字符集(charset)是用于表示文本数据的编码方式。正确设置和管理字符集对于确保数据的一致性和正确性至关重要...

    Oracle10g字符集设置,解决中文乱码

    在Windows环境下,Oracle 10g客户端的安装可能会遇到中文乱码问题,这通常是因为新安装的客户端与旧版本(如Oracle 9i)之间的字符集不兼容或者未正确设置导致的。 首先,我们要理解字符集的概念。字符集是一种定义...

    oracle修改字符集,解决乱码问题.

    oracle修改字符集,解决乱码问题.

    解决Oracle中文乱码.pdf

    Oracle 字符集乱码问题是指在 Oracle 数据库中,中文字符显示为乱码的现象。该问题可能是由于安装 Oracle 数据库时,选择了错误的字符集,或者客户端和服务器端的字符集不一致。 解决办法: 1. 检查数据库字符集...

    oracle乱码解决功能!!!

    oracle乱码解决功能的关键点在于服务器端和客户端的字符集是否一致。如果服务器端和客户端的字符集不一致,汉字将无法正确显示。解决方法是将客户端的字符集设置为与服务器端相同的字符集。 oracle乱码解决功能...

    oracle字符集转换

    Oracle字符集转换是一个重要的主题,尤其在处理多语言数据或者跨不同版本的Oracle数据库交互时。Oracle数据库系统支持多种字符集,以满足全球化的数据存储需求。字符集定义了数据库如何存储和显示字符,不同的字符集...

    centos7下Oracle12中文乱码的问题

    替换oracle解压之后的database文件中的filegroup2文件 路径 :database/stage/Components/oracle.jdk/1.6.0.75.0/1/DataFiles

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

    当SQL Server尝试通过ODBC或JDBC等方式连接到Oracle数据库时,如果两个系统的字符集设置不一致,就可能会导致中文字符显示为乱码。这个问题在64位操作系统上尤其常见,因为不同的数据库管理系统(DBMS)之间可能存在...

    Linux 下 oracle dbca netca界面乱码

    在Linux环境下,Oracle数据库的DBCA(Database Configuration Assistant)和NETCA(Network Configuration Assistant)工具在处理汉字时可能会出现乱码问题,表现为汉字显示为一个个方框。这通常是由于系统缺少对...

Global site tag (gtag.js) - Google Analytics