Pl/SQL 访问虚拟机的 oracle rac,总是乱码

 

   使用 pl/sql  访问 虚拟机上的oracle rac,总是乱码, oracle数据库的 语言环境是

     NLS_LANGUAGE =AMERICAN

     NLS_CHARACTERSET=ZHS16GBK

     我将注册表里的 nls_lang 改成 SIMPLIFIED CHINESE_CHINA.ZHS16GBK ,AMERICAN_AMERICA.ZHS16GBK  , AMERICAN_AMERICA.UTF8

      等等,好几种组合,始终是乱码。

 

      后来看一个网友的blog, 在 pl/sql  目录下 新建一个 bat文件,内容如下:

@echo off
set ORACLE_HOME=Ora10InstantClient
set TNS_ADMIN=%ORACLE_HOME%\NETWORK\ADMIN
set PATH=%ORACLE_HOME%
set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
start plsqldev.exe

运行这个bat,就不乱码了,真是奇怪。  注意,tnsnames需要放到 pl sql的目录下的NETWORK\ADMIN下。

 

自己又试验了一下 nls_lang

#常用中文#

set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK,中文正常显示

set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1   , 中文都变成了      --------靠?

set NLS_LANG=                (置为空), 中文都变成了 ???????

set NLS_LANG=AMERICAN_AMERICA.UTF8   , 提示ZHS16GBK和客户端字符集2%不同,但是中文可以正常显示。

#通用unicode#

set NLS_LANG=AMERICAN_AMERICA.AL32UTF8,也提示ZHS16GBK和客户端字符集2%不同,中文可以正常显示。

 

在cmd窗口, echo  %NLS_LANG% ,发现为空,不知道为何注册表中的nls_lang没有起作用。

所以在bat中设置了 nls_lang以后,中文可以正常显示了,有乱码的童鞋们,请先 echo  %NLS_LANG%看看,linux的话 echo $NLS_LANG查看。

如果为空的话,请设置nls_lang吧。

有时间的话可以看看eygle的网站,说的太详细了。这个是连载的。

http://www.eygle.com/archives/2004/09/nls_character_set_01.html

 

 

Oracle字符集 

转载自:http://blog.csdn.net/cfhacker007/archive/2010/10/18/5948339.aspx

ZHS16GBK > ZHS16CGB231280
国际标准中,前者包含后者;在Oracle中不是直接包含关系,不能直接将gb231280转成gbk。

Exp和Imp时,要保证以下四个字符集设置:
1、源数据库的字符集
2、操作Exp的计算机的NLS_LANG环境变量
3、操作Imp的计算机的NLS_LANG环境变量
4、目标数据库的字符集

注1:查看数据库字符集
select * from nls_database_parameters,“NLS_CHARACTERSET"对应的值就是字符集。

注2:修改Oracle字符集
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
(注意:使用”update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';,然后commit重启服务器“这种方式修改Oracle字符集存在很大隐患,可能导致各种不确定错误,不可使用。)

Oracle字符集说明:
    Oracle NLS_CHARACTERSET value
    Language

    ZHS16CGB231280
    Chinese Simplified (GB2312)
    gb2312
    chinese, csGB2312, csISO58GB231280, GB2312, GB_2312-80, iso-ir-58

    ZHS16GBK
    Chinese Simplified (Windows)
    windows-9361
    windows-936

    ZHT16BIG5
    Chinese Traditional
    big5
    csbig5, x-x-big5

    ZHT16MSWIN950
    Chinese Traditional
    windows-950

    ISO2022-CN
    Chinese
    iso-2022-cn2
    csISO2022CN

    ZHT32EUC
    Chinese Traditional (EUC-TW)
    EUC-TW1

    ISO2022-JP
    Japanese (JIS)

    JA16EUC
    Japanese (EUC)

    JA16SJIS
    Japanese (Shift-JIS)

    KO16KSC5601
    Korean

    ISO2022-KR
    Korean (ISO)

    KO16MSWIN949
    Korean (Windows)

    UTF8
    Universal (UTF-8)
    utf-8
    unicode-1-1-utf-8, unicode-2-0-utf-8, x-unicode-2-0-utf-8
   
注3:修改客户端字符集
查看环境变量:set命令
修改环境变量:
A:Linux / Unix
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export NLS_LANG

B:Windows
set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

说明:Oracle通过NLS_LANG来设置客户端字符集,NLS_LANG由以下部分组成:NLS_LANG=<Language>_<Territory>.<Clients Characterset>,例如NLS_LANG=AMERICAN_AMERICA.ZHS16GBK。
打开注册表:HKEY_LOCAL_MACHINE|SOFTWARE|ORACLE,修改注册表下nls_lang键值(包括oracle下、ID0和HOME0下的nls_lang都修改)

实例一(ZHS16CGB231280->ZHS16GBK):
1、问题:从源数据库(Oracle9i,ZHS16CGB231280字符集)直接使用exp导出dmp文件,然后imp导入到目标数据库(Oracle10g,ZHS16GBK字符集)后,表数据的中文没问题,但表结构的注释等中文信息变成了一堆问号。
2、解决:使用exp导出前,先设置系统环境变量:NLS_LANG=AMERICAN_AMERICA.ZHS16GBK,然后执行exp导出。这种方式导出的dmp文件复制到目标数据库服务器,使用imp导入后,表数据和表结构等中文信息都是正常中文了。

实例二(ZHS16GBK->ZHS16CGB231280):
1、问题:从源数据库(Oracle10g,ZHS16GBK)使用exp导出dmp文件,然后imp到目标库(Oracle9i,ZHS16CGB231280)时不成功,提示文件格式不正确。原因:高版本exp导出的dmp文件不能使用低版本imp进行导入。

 

2、解决:使用Oracle9i的exp来导出10g的数据。由于9i所在数据库服务器环境变量设置NLS_LANG=AMERICAN,导致在9i服务器上查询10g的表时,表内中文数据无法显示(一堆问号),这时可设置环境变量EXPORT NLS_LANG=AMERICAN_AMERICA.ZHS16GBK,此时中文显示就正常了。然后使用9i的exp导出10g数据,然后imp导入到9i中,成功,表数据和表结构注释等中文显示都没问题。

 

另外的一个文档,说的也挺好的:http://wenku.baidu.com/view/e474a055f01dc281e53af0b7.html

 

1. NLS_LANG 参数组成 NLS_LANG参数由以下部分组成: NLS_LANG=<Language>_<Territory>.<Clients Characterset> NLS_LANG各部分含义如下: LANGUAGE指定: -Oracle消息使用的语言 -日期中月份和日显示 TERRITORY指定 -货币和数字格式 -地区和计算星期及日期的习惯 CHARACTERSET: -控制客户端应用程序使用的字符集 通常设置或者等于客户端(如Windows)代码页 或者对于unicode应用设置为UTF8 在Windows上查看当前系统的代码页可以使用chcp命令: E:\>chcp 活动的代码页: 936 代码页936也就是中文字符集 GBK,在Microsoft的官方站点上,我们可以遭到关于936代码页的具体编码规则,请参考以下链接: http://www.microsoft.com/globaldev/reference/dbcs/936.htm 2. 查看 NLS_LANG 的方法 Windows使用: echo %NLS_LANG% 如: E:\>echo %NLS_LANG% AMERICAN_AMERICA.ZHS16GBK Unix使用: env|grep NLS_LANG 如: /opt/oracle>env|grep NLS_LANG NLS_LANG=AMERICAN_CHINA.ZHS16GBK Windows客户端设置,可以在注册表中更改NLS_LANG,具体键值位于: HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMExx\ xx指存在多个ORACLE_HOME时系统编号。 3. 查看数据库当前字符集参数设置 SELECT * FROM v$nls_parameters; 4. 查看数据库可用字符集参数设置 SELECT * FROM v$nls_valid_values; 5. 客户端 NLS_LANG 的设置方法 Windows: # 常用中文字符集 setNLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK # 常用unicode字符集 setNLS_LANG=american_america.AL32UTF8 可以通过修改注册表键值永久设置 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMExx\NLS_LANG Unix: # 常用unicode字符集 exportNLS_LANG=american_america.AL32UTF8 # 常用中文字符集 export NLS_LANG="Simplified Chinese_china".ZHS16GBK 可以编辑 bash_profile 文件进行永久设置 vi .bash_profile NLS_LANG="Simplified Chinese_china".ZHS16GBK export NLS_LANG # 使 bash_profile 设置生效 source .bash_profile ================================================================================= [Q]怎么样查看数据库字符集     [A]数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。      客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter,      表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表      会话字符集环境 select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。      客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件      字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。      [Q]怎么样修改字符集      [A]8i以上版本可以通过alter database来修改字符集,但也只限于子集到超集,不建议修改props$表,将可能导致严重错误。      Startup nomount;   Alter database mount exclusive;   Alter system enable restricted session;   Alter system set job_queue_processes=0;   Alter database open;   Alter database character setzhs16gbk; [Q]怎么样查看数据库字符集     [A]数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。      客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter,      表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表      会话字符集环境 select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。      客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件      字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。      [Q]怎么样修改字符集      [A]8i以上版本可以通过alter database来修改字符集,但也只限于子集到超集,不建议修改props$表,将可能导致严重错误。      Startup nomount;   Alter database mount exclusive;   Alter system enable restricted session;   Alter system set job_queue_process=0;   Alter database open;   Alter database character setzhs16gbk;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值