用PLSQL 查询数据,如果语句出错,执行报错信息除去ORA-XXX之外都是“???”的乱码。
(并不是链接所有的数据库都这样,只有个别库是乱码)
经查看可能是与客户端和ORACLE侧的字符集不一致造成。经查看 select userenv('language') from dual;
结果是 SIMPLIFIED CHINESE_CHINA.TH8TISASCII select * from nls_database_parameters; 的结果
NLS_LANGUAGE : AMERICAN
NLS_CHARACTERSET : TH8TISASCIIselect * from   nls_instance_parameters的执行结果
NLS_LANGUAGE : THAI
NLS_NUMERIC_CHARACTERS: null我已经修改 注册表中的NLS_LANG=SIMPLIFIED CHINESE_CHINA.TH8TISASCII
或者是AMERICAN.TH8TISASCII 但是结果都还是乱码请各位大侠伸手 ~~~PL/SQL乱码Oracle字符集nls_language

解决方案 »

  1.   

    1.常规方案修改数据库字符集
          1).sys登陆数据库:conn  /  as sysdba;
          2).关闭数据库:shutdown immediate;
          3).以mount方式开启数据库:startup mount;
          4).限制其它用户连接数据库使用资源: alter system enable restricted session;
          5).查看系统当前的进程(最大连接数):show parameter processes;记住job_queue_processes参数的当前值,后面需要修改回来。
          6).杀掉CJQ0及相应job进程: alter system set job_queue_processes=0;
          7).修改参数alter system set aq_tm_processes=0;
          8).更改数据库为open方式:alter database open;
          9).更改字符集:alter database character set us7ascii;
          a).*在这里,如果当前数据库的字符集是系统字符集us7asci的超集,更改不会出问题;如果不是,将会提示:
         ORA-12712: 新字符集必须为旧字符集的超集
         b).*如果数据库数据有CLOB类型,系统将会提示:
         ORA-12716: Cannot ALTER DATABASE CHARACTER SET when CLOB data exists
        2.  针对以上的错误a)的解决方案:使用INTERNAL_USE跳过超集检测
     ALTER DATABASE character set INTERNAL_USE us7ascii;
        3. 针对以上的错误b)的解决方案:使用internal_convert转换含有CLOB字段的表
      1).截断表truncate table Metastylesheet;
      2).alter database character set internal_convert zhs16gbk;-- ORACLE会自动转换含有CLOB
      3).因为前面清空了SYS.METASTYLESHEET表,需要重新创建
           9.2通过运行catmet.sql脚本来重建;@?/rdbms/admin/catmet.sql
                10g后通过运行catmeta.sql脚本来重建:@?/rdbms/admin/catmeta.sql
                (注意这个地方有待商榷,不确定,最好不要使用这种方法修改)
        4.完成方案a)和b)后再做如下步骤:
      1).查看当前字符集,确认是否正确修改;
      2).解除限制: 
               alter system disable restricted session; 
               alter system set job_queue_processes=10;--修改回开始记录的原始值
      3).最好也也设置一下set NLS_LANG
      4).关闭数据库再打开;
      

  2.   

    谢谢,两位的帮忙。sych888的方式是可以的,我修改成了SIMPLIFIED CHINESE_CHINA.TH8TISASCII,成功解决问题。u010412956的方式可能有效,但是通过修改Oracle字符集的方式动作太大,并且一个数据库的字符集设定是与建立在其上的程序有关联关系的。在企业应用中如果只是为了显示PLSQL的提示,更改Oracle本身的字符集是不合适的。