给个参考:
http://expert.csdn.net/Expert/topic/2014/2014176.xml?temp=.3214533
http://expert.csdn.net/Expert/topic/1998/1998729.xml?temp=.2357599导出/导入与字符集 
明白ORACLE多国语言设置,ORACLE多国语言设置是为了支持世界范围的语言与字符集,一般对语言提示、货币形式、排序方式和CHAR,VARCHAR2,CLOB,LONG字段的数据的存储/显示等有效。ORACLE多国语言设置最主要的两个特性就是国家语言设置与字符集设置。国家语言设置决定了界面或提示使用的语言种类;字符集决定了数据库保存与字符集有关数据(如文本)的编码规则。正如上面的一个小例子,环境变量NLS_LANG的不同,导致EXP帮助发生变化,这就是多国语言设置的作用(NLS_LANG包含国家语言设置与字符集设置,这里起作用的是国家语言设置,而不是字符集)。 
ORACLE字符集设定,分为数据库字符集和客户端字符集环境设置。在数据库端,字符集在创建数据库的时候设定,并保存在数据库props$表中,对于8i以上产品,已经可以采用“Alter database character set 字符集”来修改数据库的字符集,但也仅仅是从子集到超集。不要通过update props$来修改字符集,如果是不支持的转换,可能会失去所有与字符集有关的数据,就是支持的转换,也可能导致数据库的不正常工作。字符集分为单字节字符集与多字节字符集,US7ASCII就是典型的单字节字符集,在这种字符集中length=lengthb,而ZHS16GBK就是常用的双字节字符集,在这里lengthb=2*length。 
客户端的字符集环境比较简单,主要是环境变量或注册表项NLS_LANG,注意NLS_LANG的优先级别为:参数文件à注册表à环境变量àalter sessionà函数。NLS_LANG的组成为“国家语言设置.字符集”,如nls_lang=simplified chinese_china.zhs16gbk。客户端的字符集最好与数据库端一样(国家语言设置可以不一样,如zhs16gbk的字符集,客户端可以是nls_lang =simplified chinese_china.zhs16gbk或Ameircan_America.zhs16gbk,都不影响数据库字符的正常显示),如果字符集不一样,而且字符集的转换也不兼容,那么客户端的数据存储/显示和导出/导入的与字符集有关的数据将都是乱码。 
使用一点点技巧,就可以使导出/导入在不同的字符集的数据库上转换数据。这里需要一个2进制文件编辑工具即可,如uedit32。用编辑方式打开导出的dmp文件,获取2、3字节的内容,如00 01,先把它转换为10进制数,为1,使用函数NLS_CHARSET_NAME即可获得该字符集: 
SQL> select nls_charset_name(1) from dual; 
NLS_CHARSET_NAME(1) 
------------------- 
US7ASCII 
可以知道该dmp文件的字符集为US7ASCII,如果需要把该dmp文件的字符集换成ZHS16GBK,则需要用NLS_CHARSET_ID获取该字符集的编号: 
SQL> select nls_charset_id('zhs16gbk') from dual; 
NLS_CHARSET_ID('ZHS16GBK') 
-------------------------- 
              852 
把852转换成16进制数,为354,把2、3字节的00 01换成03 54,即完成了把该dmp文件字符集从us7ascii到zhs16gbk的转化,这样,再把该dmp文件导入到zhs16gbk字符集的数据库就可以了。(注意,十进制与十六进制之间的转换,想明白其中的道理)
怎么样查看数据库字符集 
[A]数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。 
  客户端字符集环境select * from nls_instance_parameter,其来源于v$parameter, 
表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表 
  会话字符集环境 select * from nls_session_parameter,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameter一致。 
  客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件 
  字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
1.查询服务器端配置的字符集。在sqlplus中以dba用户执行:
select tab1.aa||'_'||tab2.bb||'.'||tab3.cc from (select VALUE$ aa from sys.props$ where name='NLS_LANGUAGE')tab1,(select VALUE$ bb from sys.props$ where name='NLS_ISO_CURRENCY')tab2,(select VALUE$ cc from sys.props$ where name='NLS_CHARACTERSET')tab3;2.在客户端的注册表HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE->HOME0中,如无系统变量NLS_LANG,则“新建”->“字符串”,重命名为“NLS_LANG”,并赋值为上述查询变量的值(注意引号内的字符应大写),再查看时不需要重启Oracle。1、检查服务器上Oracle数据库的字符集SQL> conn sys/change_on_install
连接成功.SQL> desc props$
 列名                          可空值否   类型
 ------------------------------- -------- ----
 NAME                            NOT NULL VARCHAR2(30)
 VALUE$                                   VARCHAR2(2000)
 COMMENT$                                 VARCHAR2(2000)SQL> col value$ format a40
SQL> select name,value$ from props$;NAME                           VALUE$
------------------------------ -------------------------
DICT.BASE                      2
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_CURRENCY                   $
NLS_ISO_CURRENCY               AMERICA
NLS_NUMERIC_CHARACTERS         .,
NLS_DATE_FORMAT                DD-MON-YY
NLS_DATE_LANGUAGE              AMERICAN
NLS_CHARACTERSET               ZHS16GBK
NLS_SORT                       BINARY
NLS_CALENDAR                   GREGORIAN
NLS_RDBMS_VERSION              7.3.4.0.0
GLOBAL_DB_NAME                 ORACLE.WORLD
EXPORT_VIEWS_VERSION           3NLS_CHARACTERSET和NLS_CHAR_CTERSET这个参数应该是ZHS16GBK,如不是,改为它。SQL*Plus中修改方法:
SQL> update props$ set value$='新字符集' where name='NLS_CHARACTERSET';solaris8、oracle8.1.7  
 
环境:  
ORACLE_SID=ora8i  
ORACLE_BASE=$HOME  
ORACLE_HOME=$ORACLE_BASE/products/8.1.7  
NLS_LANG="SIMPLIFIED  CHINESE_CHINA.ZHS16GBK"  
LD_LIBRARY_PATH=/usr/lib:/usr/dt/lib:/usr/openwin/lib:$ORACLE_HOME/lib  
PATH=$PATH:/usr/dt/bin:/usr/openwin/bin:$ORACLE_HOME/bin  
export  ORACLE_BASE  ORACLE_HOME  ORACLE_SID  NLS_LANG  LD_LIBRARY_PATH  PATH  
 
v$nls_parameters的内容:  
'PARAMETER','VALUE'  
'NLS_LANGUAGE','SIMPLIFIED  CHINESE'  
'NLS_TERRITORY','CHINA'  
'NLS_CURRENCY','RMB'  
'NLS_ISO_CURRENCY','CHINA'  
'NLS_NUMERIC_CHARACTERS','.,'  
'NLS_CALENDAR','GREGORIAN'  
'NLS_DATE_FORMAT','DD-MON-RR'  
'NLS_DATE_LANGUAGE','SIMPLIFIED  CHINESE'  
'NLS_CHARACTERSET','US7ASCII'  
'NLS_SORT','BINARY'  
'NLS_TIME_FORMAT','HH.MI.SSXFF  AM'  
'NLS_TIMESTAMP_FORMAT','DD-MON-RR  HH.MI.SSXFF  AM'  
'NLS_TIME_TZ_FORMAT','HH.MI.SSXFF  AM  TZH:TZM'  
'NLS_TIMESTAMP_TZ_FORMAT','DD-MON-RR  HH.MI.SSXFF  AM  TZH:TZM'  
'NLS_DUAL_CURRENCY','RMB'  
'NLS_NCHAR_CHARACTERSET','US7ASCII'  
'NLS_COMP','BINARY'  
 
 
字符集是US7ASCII,怎样设置为ZHS16GBK(是否这样写)呢?  
请大家帮帮忙吧,多谢了  
 
 
---------------------------------------------------------------  
 
c:\>svrmgrl  
在svrmgrl中执行:  
shutdown  
startup  mount  
ALTER  SYSTEM  ENABLE  RESTRICTED  SESSION;    
ALTER  SYSTEM  SET  JOB_QUEUE_PROCESSES=0;    
ALTER  SYSTEM  SET  AQ_TM_PROCESSES=0;    
ALTER  DATABASE  OPEN;    
update  props$  set  value$='ZHS16GB'  WHERE  NAME='NLS_CHARACTERSET';  
update  props$  set  value$='ZHS16GB'  WHERE  NAME='NLS_NCHAR_CHARACTERSET';  
先申明此法很危险,  
如果改错了值可能会导致数据库无法打开。  
 
×××××××××××××  
修改字符集的步骤:  
c:\>svrmgrl  
在svrmgrl中执行:  
connect  internal/oracle[@dbname];  
shutdown  immediate;  
startup  restrict;  
ALTER  DATABAE  [dbname]  CHARACTER  SET  [SIMPLIFIED  CHINESE_CHINA.]ZHS16GBK  ;    
ALTER  DATABAE  [dbname]  NATIONAL  CHARACTER  SET  [SIMPLIFIED  CHINESE_CHINA.]ZHS16GBK  ;    
alter  database  [dbname]  open;  
--shutdown  immediate;  
--startup;  
 怎么样查看数据库字符集 
[A]数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。 
  客户端字符集环境select * from nls_instance_parameter,其来源于v$parameter, 
表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表 
  会话字符集环境 select * from nls_session_parameter,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameter一致。 
  客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件 
  字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。

解决方案 »

  1.   

    我看晕了,吐血。那就用USA7ASCII一样可以显示中文吧。只是客户端需要设置成他的超集或者也设置成US7ASCII吗?但我是把ORACLE的函数JDBC包直接拷贝到WIN2000下TOMCAT的CLASS目录下使用的。怎么设置字符集?
      

  2.   

    影响ORACLE汉字显示的字符集问题 
    中原油田研究院 
    康子明 等4人 
    ---- 在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多。ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉字信息的显示方面着实给中国用户带来不少麻烦,笔者多年从事ORACLE数据库管理,经常收到周围用户和外地用户反映有关ORACLE数据库汉字显示问题的求援信,主要现象是把汉字显示为不可识别的乱码,造成原来大量信息无法使用。本文将就这一问题产生的原因和解决办法进行一些探讨,供存在这方面问题的用户朋友参考。 ---- 1、原因分析 ---- 通过对用户反映情况的分析,发现字符集的设置不当是影响ORACLE数据库汉字显示的关键问题。那么字符集是怎么一会事呢?字符集是ORACLE 为适应不同语言文字显示而设定的。用于汉字显示的字符集主要有ZHS16CGB231280,US7ASCII,WE8ISO8859P1等。字符集不仅需在服务器端存在,而且客户端也必须有字符集注册。服务器端,字符集是在安装ORACLE时指定的,字符集登记信息存储在ORACLE数据库字典的V$NLS_PARAMETERS表中;客户端,字符集分两种情况,一种情况是sql*net 2.0以下版本,字符集是在windows的系统目录下的oracle.ini文件中登记的;另一种情况是sql*net 2.0以上(即32位)版本,字符集是在windows的系统注册表中登记的。要在客户端正确显示ORACLE 数据库汉字信息,首先必须使服务器端的字符集与客户端的字符集一致;其次是加载到ORACLE数据库的数据字符集必须与服务器指定字符集一致。因此,把用户存在的问题归纳分类,产生汉字显示异常的原因大致有以下几种: ---- 1. 1服务器指定字符集与客户字符集不同,而与加载数据字符集一致。 ---- 这种情况是最常见的,只要把客户端的字符集设置正确即可,解决办法见2.1。 ---- 1. 2服务器指定字符集与客户字符集相同,与加载数据字符集不一致。 ---- 这类问题一般发生在ORACLE版本升级或重新安装系统时选择了与原来服务器端不同的字符集,而恢复加载的备份数据仍是按原字符集卸出的场合,以及加载从其它使用不同字符集的ORACLE数据库卸出的数据的情况。这两种情况中,不管服务器端和客户端字符集是否一致都无法显示汉字。解决办法见2.2。 ---- 1.3服务器指定字符集与客户字符集不同,与输入数据字符集不一致。 ---- 这种情况是在客户端与服务器端字符集不一致时,从客户端输入了汉字信息。输入的这些信息即便是把客户端字符集更改正确,也无法显示汉字。解决办法见2.3。 ---- 2.解决办法 ---- 下面将分别对上述三种情况给出解决办法。为了叙述方便,假设客户端使用WINDOWS95/98环境,并已成功地配置了TCP/IP协议,安装了ORACLE的sql*net,sql*pluse产品。 ---- 2.1 设置客户端字符集与服务器端字符集一致 ---- 假设当前服务器端使用US7ASCII字符集。 ---- (1)查看服务器端字符集 ---- 通过客户端或服务器端的sql*plus登录ORACLE的一个合法用户,执行下列SQL语句:    SQL > select * from V$NLS_PARAMETERS 
    parameter             value
    NLS_LANGUAGE                   AMERICAN
    NLS_TERRITORY                  AMERICA
    ….                             ….
    NLS_CHARACTERSET               US7ASCII
    NLS_SORT                       BINARY
    NLS_NCHAR_CHARACTERSET         US7ASCII---- 从上述列表信息中可看出服务器端ORACLE数据库的字符集为'US7ASCII'。 ---- (2)按照服务器端字符集对客户端进行配置 ---- 配置方法有两种: 安装ORACLE的客户端软件时指定
    ---- 在安装ORACLE的客户端产品软件时,选择与ORACLE服务端一致的字符集(本例为US7ASCII)即可。 修改注册信息的方法
    ---- 根据ORACLE 客户端所选sql*net 的版本分为下列两种情况: ---- a. 客户端为 sql*net 2.0 以下版本 ---- 进入Windows的系统目录,编辑oracle.ini文件,用US7ASCII替换原字符集,重新启动计算机,设置生效。 ---- b. 客户端为 sql*net 2.0 以上版本 ---- 在WIN98 下 运 行REGEDIT,第一步选HKEY_LOCAL_MACHINE,第二步选择SOFTWARE, 第三步选择 ORACLE, 第四步选择 NLS_LANG, 键 入 与服 务 器 端 相 同 的 字 符 集(本例为:AMERICAN_AMERICAN.US7ASCII)。 ---- 2.2 强制加载数据字符集与服务器端字符集一致 ---- 假设要加载数据从原ORACLE数据库卸出时的字符集为US7ASCII,当前ORACLE服务器字符集为WE8ISO8859P1。 ---- 下面提供三种解决方法: ---- (1) 服务器端重新安装ORACLE ---- 在重新安装ORACLE 时选择与原卸出数据一致的字符集(本例为US7ASCII)。 ---- 加载原卸出的数据。 ---- 这种情况仅仅使用于空库和具有同一种字符集的数据。 ---- (2)强行修改服务器端ORACLE当前字符集 ---- 在用imp命令加载数据前,先在客户端用sql*plus登录system DBA用户,执行下列SQL语句进行当前ORACLE数据库字符集修改:  SQL > create database  character set US7ASCII
    * create database character set US7ASCII
          ERROR at line 1:
    ORA-01031: insufficient privileges---- 你会发现语句执行过程中,出现上述错误提示信息,此时不用理会,实际上ORACLE数据库的字符集已被强行修改为US7ASCII,接着用imp命令装载数据。等数据装载完成以后,shutdown 数据库,再startup 数据库,用合法用户登录ORACLE数据库,在sql>命令提示符下,运行select * from V$NLS_PARAMETERS,可以看到ORACLE数据库字符集已复原,这时再查看有汉字字符数据的表时,汉字已能被正确显示。 ---- (3)利用数据格式转储,避开字符集限制 ---- 这种方法主要用于加载外来ORACLE数据库的不同字符集数据。其方法如下: ---- 先将数据加载到具有相同字符集的服务器上,然后用转换工具卸出为foxbase 格式或access格式数据库,再用转换工具转入到不同字符集的ORACLE数据库中,这样就避免了ORACLE字符集的困扰。目前数据库格式转换的工具很多,象power builder5.0以上版本提供的pipeline,Microsoft Access数据库提供的数据导入/导出功能等。转换方法参见有关资料说明。. ---- 2.3匹配字符集替换汉字 ---- 对于1.3提到的情况,没有很好的办法,只能先把客户端与服务器端字符集匹配一致后,根据原输入汉字的特征码替换汉字字符部分。