5
回答
Oracle修改字符集从AL32UTF8到ZHS16GBK后数据乱码
滴滴云服务器,限时包月0.9元,为开发者而生>>>   

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

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

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

举报
Mr.寂寞
发帖于4年前 5回/6K+阅
共有5个答案 最后回答: 4年前
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; 

我是通过这样修改的

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

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

--- 共有 1 条评论 ---
Mr.寂寞我数据库文件是从ZHS16GBK导出的,导入到服务端AL32UTF8,现在将ALUTF8字符集改成 ZHS16GBK不行么. 4年前 回复
AL32UTF8和ZHS16GBK是不兼容的字符集,直接修改数据库的字符集当然会出现乱码,如果表不多,用sqlldr导出,再导入另外一个ZHS16GBK数据库,这样就不会出现乱码
--- 共有 1 条评论 ---
Mr.寂寞嗯,就是表数据还挺大的,所以想先看看有没有不通过重导数据的办法,谢谢 4年前 回复
顶部