日期:2014-05-16 浏览次数:20526 次
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数据库中字符集的修改就能够轻松应对,如果大家有更多更好的方法,就要拿出来与大家一起分享哦,不要独吞啊。