Oracle修改字符集从AL32UTF8到ZHS16GBK后数据乱码

Mr.寂寞 发布于 2013/09/10 09:38
阅读 7K+
收藏 1

如题,由于开始装oracle时没注意字符编码,数据导入后想修改。

通过命令修改也成功了,从AL32UTF8修改成ZHS16GBK编码,但是一看数据库表原来中文

的数据都乱码了?这要怎么改呢,网上有说改本地字符集.哪里改?

加载中
0
M
Mr.寂寞
SQL> conn /as sysdba 
SQL> 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; 
ORA-12712: new character set must be a superset of old character set 
提示我们的字符集:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改: 
SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK; 
--我们看到这个过程和之前ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使Oracle数据库绕过了子集与超集的校验. 
SQL> select * from v$nls_parameters;  
SQL> shutdown immediate; 
SQL> startup 

SQL> select * from v$nls_parameters; 

我是通过这样修改的

0
M
Mr.寂寞
没人在么。应该有人碰到同样问题的吧。
0
IdleMan
IdleMan

Oracle只支持子集到超级的转换,否则容易出问题。AL32UTF8不是ZHS16GBK的子集。

修改本地的环境变量NLS_LANG或者注册表的NLS_LANG

M
Mr.寂寞
我数据库文件是从ZHS16GBK导出的,导入到服务端AL32UTF8,现在将ALUTF8字符集改成 ZHS16GBK不行么.
0
仪山湖
仪山湖
AL32UTF8和ZHS16GBK是不兼容的字符集,直接修改数据库的字符集当然会出现乱码,如果表不多,用sqlldr导出,再导入另外一个ZHS16GBK数据库,这样就不会出现乱码
M
Mr.寂寞
嗯,就是表数据还挺大的,所以想先看看有没有不通过重导数据的办法,谢谢
0
仪山湖
仪山湖
如果是10G及更高版本,用impdp/expdp工具
返回顶部
顶部