5
回答
Oracle修改字符集从AL32UTF8到ZHS16GBK后数据乱码
科大讯飞通用文字识别100000次/天免费使用。立即申请   

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

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

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

举报
Mr.寂寞
发帖于5年前 5回/7K+阅
共有5个答案 最后回答: 5年前
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不行么. 5年前 回复
AL32UTF8和ZHS16GBK是不兼容的字符集,直接修改数据库的字符集当然会出现乱码,如果表不多,用sqlldr导出,再导入另外一个ZHS16GBK数据库,这样就不会出现乱码
--- 共有 1 条评论 ---
Mr.寂寞嗯,就是表数据还挺大的,所以想先看看有没有不通过重导数据的办法,谢谢 5年前 回复
顶部