这是 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也提示。
不影响数据库的操作就行。
------解决方案--------------------------------------------------------
--要解决这个问题有两种方法
--一个是,利用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安装好后
字符集是不需要修改的,如果修改也要遵循一定的原则的,超集与子集的关系相互的转化时
没有任何问题的。