PL/SQL Developer 在windows7 64位系统下连Oaracle11g64位系统的解决经验

                                   PL/SQL Developer 在windows7 64位系统下连Oaracle11g64位系统的解决经验
一、问题现象及解决方法
现象:
1.PL/SQL 无法登录64位数据库
2.在PL/SQL developer中输入中文,保存后,中文变成‘??‘这样的乱码符号
3.导入带有中文的数据后,中文数据变成‘??‘这样的乱码符号
环境:
1.windows7 64位系统
2.oracle11g 64位系统
3.PL/SQL developer 9.0
解决方法:
1.下载windows32位的instantclient包,并放到某个目录下,假设D:\instantclient
2.拷贝D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN到D:\instantclient下
(假设oracle11g安装目录是D:\App\Administrator\Product\11.2.0\dbhome_1\)
3.把tnsnames.ora文件放到D:\instantclient\Network\Admin目录下
4.把D:\instantclient加到操作系统的Path路径的最前面。
5.增加系统环境变量TNS_ADMIN变量的值为D:\instantclient
6.PL/SQL Developer的工具首选项的Oracle主目录名为D:\instantclient,OCI库为D:\instantclient\OCI.DLL
7.核对Oracle11g的字符集和操作系统的字符集是否一致,一致才不会乱码,假设需一致为ZHS16GBK。
8.如果Oracle11g字符集不是ZHS16GBK,修改oracle11g的字符集为ZHS16GBK
9.增加操作系统环境变量NLS_LANG变量的值为SIMPLIFIED CHINESE_CHINA.ZHS16GBK或AMERICAN.ZHS16GBK

二、经验教训
   网络上对于此类问题,大多也是这么解决的。我按照网络上的方法试了很多次,还重装过几次Oracle,折腾很久最终才解决了乱码问题。
   之所以折腾很久,是因为验证方法上出现了失误,在问题解决之前,我一直觉得要把之前输入的中文变成的‘????‘,使之再次变成中文才算解决问题,
   实际上再次录入中文,保存后不变成‘???’即解决乱码问题,所以细节很重要。有的时候,在普遍的方法都是一样的方法的时候,那么这种方法应该是奏效的,至于一次次   的操作后,还没解决问题,应该冷静的想想操作过程,想想细节,问题可能就出在操作细节上,验证方法上。
 
三、相关知识
1、如何查看windows操作系统当前使用的字符集
Chcp
显示活动控制台代码页数量,或更改该控制台的活动控制台代码页。如果在没有参数的情况下使用,则 chcp 显示活动控制台代码页的数量。
语法
chcp [nnn]
参数
指定代码页。下表列出了所有支持的代码页及其国家(地区)或者语言:
代码页       国家(地区)或语言
437          美国
708          阿拉伯文(ASMO 708)
 720          阿拉伯文(DOS)
 850          多语言(拉丁文 I)
852          中欧(DOS) - 斯拉夫语(拉丁文 II)
855          西里尔文(俄语)
857          土耳其语
860          葡萄牙语
861          冰岛语
862          希伯来文(DOS)
 863          加拿大 - 法语
865          日耳曼语
866          俄语 - 西里尔文(DOS)
869          现代希腊语
 874          泰文(Windows)
 932          日文(Shift-JIS)
 936          中国 - 简体中文(GB2312)
 949          韩文
 950          繁体中文(Big5)
 1200         Unicode       
1201         Unicode (Big-Endian)
 1250         中欧(Windows)
 1251         西里尔文(Windows)
 1252         西欧(Windows)
 1253         希腊文(Windows)
 1254         土耳其文(Windows)
 1255         希伯来文(Windows)
 1256         阿拉伯文(Windows)
 1257         波罗的海文(Windows)
 1258         越南文(Windows)
 20866        西里尔文(KOI8-R)
 21866        西里尔文(KOI8-U)
 28592        中欧(ISO)
 28593        拉丁文 3 (ISO)
 28594        波罗的海文(ISO)
 28595        西里尔文(ISO)
 28596        阿拉伯文(ISO)
 28597        希腊文(ISO)
 28598        希伯来文(ISO-Visual)
 38598        希伯来文(ISO-Logical)
 50000        用户定义的
 50001        自动选择
 50220        日文(JIS)
 50221        日文(JIS-允许一个字节的片假名)
 50222        日文(JIS-允许一个字节的片假名 - SO/SI)
 50225        韩文(ISO)
 50932        日文(自动选择)
 50949        韩文(自动选择)
 51932        日文(EUC)
 51949        韩文(EUC)
 52936        简体中文(HZ)
 65000        Unicode (UTF-7)
 65001        Unicode (UTF-8)

在Windows平台下,直接在命令行中,输入以下命令,就会显示windows操作系统当前使用的字符集:

chcp


影响Oracle数据库字符集最重要的参数是NLS_LANG参数。
 
它的格式如下: NLS_LANG = language_territory.charset
 
它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。
 
其中:
 
Language: 指定服务器消息的语言, 影响提示信息是中文还是英文
 
Territory: 指定服务器的日期和数字格式,
 
Charset:  指定字符集。
 
如:AMERICAN _ AMERICA. ZHS16GBK
 
从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。
 
所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。
 
怎么查看数据库版本
 select * from v$version   包含版本信息,核心版本信息,位数信息(32位或64位)等 
 
2、查看数据库字符集
 数据库服务器字符集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一致。

查询oracle server端的字符集

 有很多种方法可以查出oracle server端的字符集,比较直观的查询方法是以下这种:
 
 SQL> select userenv(‘language‘) from dual;
 
 USERENV(‘LANGUAGE‘)
 
----------------------------------------------------

 SIMPLIFIED CHINESE_CHINA.ZHS16GBK
 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。