日期:2014-05-17  浏览次数:20908 次

Oracle 服务器字符集和pl/sql字符集问题,求救!!!
这是 Oracle 服务器 字符集:SIMPLIFIED CHINESE_CHINA.AL32UTF8

这是注册表里的:SIMPLIFIED CHINESE_CHINA.ZHS16GBK


使用 plsql登录时提示字符集的 2% 不一致,于是把注册表里改了SIMPLIFIED CHINESE_CHINA.AL32UTF8 , 一致了!!


问题:

服务器:CHINESE_CHINA.AL32UTF8
客户端:CHINESE_CHINA.AL32UTF8

我登录 sqlplus 后,命令输入了:select top 2 * from emp;

我知道 top 2 * 会提示错误:为什么错误是乱码?????


于是我又把注册表改回 ZHS16GBK,服务器还是 AU32UTF8,正常了!

怎么办? 如果字符集一致,sqlplus会出乱码,如果不一致,就正常!



我不想改服务器字符集

------解决方案--------------------
不用改字符集啊。不一致就不一致呗。
提示就提示去呗。
我的plsql也提示。
不影响数据库的操作就行。
------解决方案--------------------
SQL code
--要解决这个问题有两种方法

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

--还有一个是利用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>alter database character set internal_use zhs16gbk;

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默认字符集zhs16GBK。一般的oracle安装好后
字符集是不需要修改的,如果修改也要遵循一定的原则的,超集与子集的关系相互的转化时
没有任何问题的。