日期:2014-05-16  浏览次数:20522 次

关于oracle 字符集的一些问题
1 、  一般情况下  程序能正常使用,而黑框sqlplus 查询乱码  或是plsql  
      查询乱码都是 oracle 客户端字符集设置有问题

2     oracle 客户端字符集查询

       1 ,  select userenv('language') from dual;

       2 ,  [b] select * from v$nls_parameters;[/b]

[b]3  [/b]服务器  字符集查询视图  nls_database_parameters 来源于props$,是表示数据库的字符集。在创建数据库的时候设定的,一般不会改变.

4    v$nls_parameters 显示当前会话值 ,他受客户端nls 的控制。  其值直接在注册表中修改比较可靠

[b]5、修改server端字符集(不建议使用)[/b]

1、修改server端字符集(不建议使用)

在oracle 8之前,可以用直接修改数据字典表props$来改变数据库的字符集。但oracle8之后,至少有三张系统表记录了数据库字符集的信息,只改props$表并不完全,可能引起严重的后果。正确的修改方法如下:

$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

注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的字符集必须是ORACLE支持,不然不能start) 按上面的做法就可以,但是可能会出现‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists’ 这样的提示信息

要解决这个问题有两种方法:

1、一个是,利用INTERNAL_USE 关键字修改区域设置,

2、还有一个是利用re-create,但是re-create有点复杂,所以请用internal_use,

SQL>SHUTDOWN IMMEDIATE; 
SQL>STARTUP MOUNT EXCLUSIVE; 
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 NATIONAL CHARACTER SET INTERNAL_USE UTF8; 
SQL>SHUTDOWN immediate; 
SQL>startup;

如果按上面的做法做,National charset的区域设置就没有问题

2、修改dmp文件字符集

上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。

具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。

比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL查出该种字符集对应的16进制代码: SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;

0354

然后将dmp文件的2、3字节修改为0354即可。

如果dmp文件很大,用ue无法打开,就需要用程序的方法了。
利用上文中介绍的两种方法就能够实现Oracle数据库中字符集的修改,相信大家学过本文之后,以后再遇到Oracle数据库中字符集的修改就能够轻松应对,如果大家有更多更好的方法,就要拿出来与大家一起分享哦,不要独吞啊。