前往顾页
以后地位: 主页 > 收集编程 > Jsp实例教程 >

sqlplus连接oracle乱码处理计划

时候:2012-03-14 01:00来源:知行网www.zhixing123.cn 编辑:麦田守望者

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设置.
 

------分开线----------------------------
标签(Tag):数据库 Oracle Oracle数据库
------分开线----------------------------
保举内容
猜你感兴趣