目前的项目是用oracle+java开发的,java的编码方式是UTF8,而数据库里面的字符集是ZHS16GBK,
java提交数据库后显示为乱码,现在需要将数据库里面的字符集转换为AL32UTF8.请问下怎么转换?谢谢!

解决方案 »

  1.   

    这是以前收集的,迫不得以别更改字符集,会有很多后续的问题,这是禁忌注册表中(Windows)或环境变量中(UNIX/LINUX下)中语言设置AMERICAN_AMERICA.US7ASCII只是决定当前机器上Oracle应用程序或数据库工具对实际数据库中数据显示格式或字符集的翻译,并不影响实际数据库中的语言设置。Oracle数据库实际语言设置是在创建库时决定的,通过改执行机上的上述设置,并不会对数据库中的语言及字符集配置产生影响,当然,可以通过alter  database语句修改库的语言及字符集设置,这也有一定限制,如可能使库中已存在的数据无用。  
    AMERICAN_AMERICA.US7ASCII中前面AMERICAN_AMERICA决定了Oracle返回信息的语言类别,如ORA-XXXXX的出错信息为英语显示,你用SIMPLIFIED  CHINESE.US7ASCII,则显示为中文信息,当然,前提是你安装了相应语言的MSG文件,另还决定了日期、货币等缺省显示格式;AMERICAN_AMERICA.US7ASCII中后面的US7ASCII决定该机上执行的Oracle应用程序或管理工具对数据库中字符型数据字符集的翻译理解。  
     
    根据你的叙述,基本可断定A机数据库字符集为US7ASCII(注意:不是指A机上的环境或注册表设置,一般,字符集在创建库时已确定,实际运行的系统不可能对数据库字符集进行更改,因为可能破坏数据),而B机的数据库字符集不是US7ASCII,最简单的方法,你应删除B机上的实例后重建,重建时注意选择正确的字符集,为保证兼容性,至于客户机的环境或注册表设置必须为XXX.US7ASCII,XXX不作特别要求.如不允许重建B机数据库,则只能修改,8i下运行svrmgrl,一般如下:  
    SVRMGR>connect  internal;  
    SVRMGR>Shutdown  immediate;  
    SVRMGR>startup  mount;  
    //断开网线,并无其他程序访问数据库,则下三句可以不要  
    SVRMGR>alter  system  enable  restricted  session;  
    SVRMGR>alter  system  set  job_queue_processes=0;  
    SVRMGR>alter  system  set  aq_tm_processes=0;  
    SVRMGR>alter  database  open;  
    SVRMGR>alter  database  character  set  US7ASCII;  //影响char,  varchar2,  CLOB等  
    SVRMGR>alter  database  national  character  set  US7ASCII;//影响nchar,  nvarchar2,  NCLOB等  
    SVRMGR>Shutdown  immediate;  
    SVRMGR>startup;  
     
     
    Oracle中的语言及字符集含义非常复杂,某些字符集有一定的兼容性,可能字符集X是字符集Y的子集,或正巧你数据库中已存在地数据对于X、Y正好相同,则通过alter  database改变现有数据库不会破坏数据,否则...最好多看帮助。
      

  2.   


    US7ASCII字符集是ZHS16GBK字符集的子集,不能被修改,谢谢楼上!