近日在研究oracle的字符集问题,,在网上也看到了一些相关资料,但还是总结不出来。在这里想知道的兄弟们给个指点。。我的问题是1、oracle中到底有几个字符集的概念,如服务器字符集,客户端字符集,数据库字符集,DMP字符集。 2.这里字符集是用那个,在那里可以看到,还有的是那些字符集能修改,那些不能修改。。

解决方案 »

  1.   

    1.查询数据库字符集 
    select * from V$NLS_PARAMETERS; 
    其中 
        nls_language表示了显示方式, 就是sqlplus的程序的显示字体,有SIMPLIFIED CHINESE,American america 
        nls_characterset是字符集设定, 常用的一些字符集有UTF8,US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK, AL32UTF8  
    2.修改数据库字符集 
      $sqlplus /nolog 
      SQL>conn / as sysdba; 
      若此时数据库服务器已启动,则先执行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; 
      SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK; 
      SQL>SHUTDOWN IMMEDIATE; 
      SQL>STARTUP 
    3. 修改客户端字符集 
    oracle 的sqlplus会去读取OS中环境变量下的nls_lang信息 
    NSL_LANG包括三个部分(语言_地区.字符集)就是V$NLS_PARAMETERS表中的NLS_LANGUAGE,NLS_TERRITORY,NLS_CHARACTERSET 
    例如可以在cmd中键入 
        set nls_lang="Simplified chinese_china.utf8" 
        set nls_lang="american_america.us7ascii" 
        set nls_lang="american_america.zhs16gbk" 
    unix下类似, 不过nls_lang要大写NLS_LANG, 在.profile或这.bash_profile(根据你用的shell)里更改NLS_LANG可以长久保持环境变量值. 
    4. 解决查询时显示中文部分显示乱字符 
    这一般是由于服务器端的字符集设定与客户端的字符集设定不同造成的。只要将两者修改一致就可以解决问题。 
    5. 终端应用程序的字符集 
    如果数据库字符集和sqlplus的字符集一致, 还是不能正确显示了, 那很可能就是你的终端应用程序的字符集不支持了. 例如你用bash登陆sqlplus, 如果你的bash是个小字符集, 那么就不能正常显示了. 
    linux修改bash的字符集, 可以先键入locale, 看有哪些环境变量, 再用export设置. 
    6.导入数据时提示字符集不匹配问题 
    exp/imp与sql*plus一样是客户端产品,因此他的字符集是由服务端的nls_lang所设定的。用exp导出备份的export file时,字符集的设定也被存放在export file里。这就是有些人在imp发生字符无法转换时更改export file文件头的原理 
      

  2.   

    谢二楼的dinanzhang的指点。。但我还是有几个疑问,,,我用的是windows的操作系统。。我在系统的注册表中看到有两个地方是配置nls_lang的值,,分别是HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0跟HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\这两个地方,,我想问一下。。这里的值是不是一个是客户端的字符值。。一个是服务器的字符集?另一个问题。在网上说。。可以修改DMP文件的第二三个字节来骗过服务器进行导入???其实这样的操作,,会有什么后患没有???用ultraedit怎样定位到DMP文件的第二、三个字节上??