使用ultraedit32打开导出的dmp文件,文件内容以十六进制显示数据,其中第二、三字节的数据记录的是此文件的字符集。
例如:
03 54
将其转换为10进制,值为852,使用命令
select nls_charset_name(852) from dual
得到结果
ZHS16GBK
当前使用winXP简体中文操作系统,Oracle客户端默认字符集为GBK。
创建数据库,设定数据库字符集、国家字符集为UTF8,如须在此操作系统上导出文件,并导入至另一winXP简体中文操作系统
服务器上,须将客户端字符集修改为UTF8。
方法一:将dmp文件二、三字节修改为oracle字符集名对应的id值
例如,使用命令select nls_charset_id('UTF8') from dual,得到结果为871
将871转换为十六进制为03 67,即,把03 54 改为 03 67
导入修改后的dmp文件
方法二:修改注册表项NLS_LANG的值为UTF8
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/battlehawk/archive/2009/12/28/5090175.aspx
在导出操作时,非常重要的是客户端的字符集设置,也就是客户端的NLS_LANG设置。
NLS_LANG参数由以下部分组成:
NLS_LANG=<Language>_<Territory>.<Clients Characterset>
NLS_LANG各部分含义如下:
LANGUAGE指定:
-Oracle消息使用的语言
-日期中月份和日显示
TERRITORY指定
-货币和数字格式
-地区和计算星期及日期的习惯
CHARACTERSET:
-控制客户端应用程序使用的字符集
通常设置或者等于客户端(如Windows)代码页
或者对于unicode应用设置为UTF8
在Windows上查看当前系统的代码页可以使用chcp命令:
E:\>chcp
活动的代码页: 936
代码页936也就是中文字符集 GBK。
通常在导出时最好把客户端字符集设置得和数据库端相同,这样可以避免在导出时发生不必要的数据转换,导出文件将和数据库具有相同的字符集。
即使将来会把导出文件导入到不同字符集的数据库中,这样做也可以把转换延缓至导入时刻。
当进行数据导入时,主要存在以下两种情况:
1.源数据库和目标数据库具有相同字符集设置
这时,只需要设置NLS_LANG等于数据库字符集即可导入(前提是,导出使用的是和源数据库相同字符集,即三者相同)
2.源数据库和目标数据库字符集不同
如果我们导出时候使用的NLS_LANG是和源数据库相同的字符集,那么导入时就可以设置客户端NLS_LANG等于导出时使用的字符集,这
样转换只发生在数据库端,而且只发生一次。
dmp文件用UltraEdit打开查看十六进制文件,第2-3个字节表示字符集,假如是"00 01"。
在Unix上我们可以通过以下命令来查看:cat expdat.dmp | od -x | head
查看这个十六进制id的十进制:
SQL> select to_number(1,'xxxx') from dual;
TO_NUMBER(1,'XXXX')
-------------------
1
查看这个十进制id表示的字符集:
SQL> select nls_charset_name(1) from dual;
NLS_CHARSET_NAME(1)
----------------------------------------
US7ASCII
查看目标字符集的十进制id:
SQL> select nls_charset_id('zhs16gbk') from dual;
NLS_CHARSET_ID('ZHS16GBK')
--------------------------
852
查看这个十进制id的十六进制:
SQL> select to_char(852,'xxxx') from dual;
TO_CHAR(852,'XXXX')
--------------------------------------------------------------------------------
354
dmp文件用UE打开,把"00 01"改为"03 54"即完成了字符集的转换。
查询数据库中有效的字符集可以使用以下脚本:
col nls_charset_id for 9999
col nls_charset_name for a30
col hex_id for a20
select nls_charset_id(value) nls_charset_id, value nls_charset_name, to_char(nls_charset_id(value),'xxxx') hex_id
from v$nls_valid_values
where parameter = 'CHARACTERSET'
order by nls_charset_id(value);
查询oracle server字符集:
select * from v$nls_database_parameters;
查询客户端登陆session字符集:
select * from v$nls_session_parameters;
通常在我们的现实环境中,存在3个字符集设置。
第一: 客户端应用字符集(Client Application Character Set)
第二: 客户端NLS_LANG参数设置
第三: 服务器端,数据库字符集(Character Set)设置
我们说,一个字符在客户端应用(比如SQLPLUS,CMD,NOTEPAD等)中以怎样的字符显示取决于客户端操作系统,客户端能够显示怎样的字符,
我们就可以在应用中录入这些字符,至于这些字符能否在数据库中正常存储,就和另外的两个字符集设置紧密相关了。
在传输过程中,客户端NLS_LANG主要用于进行转换判断
如果NLS_LANG等于数据库字符集,则不进行任何转换直接把字符插入数据库
如果不同则进行转换,转换主要有两个任务
如果存在对应关系,则把相应二进制编码经过映射后(这一步映射以后,所代表的字符可能发生转换)传递给数据库
如果不存在对应关系,则传递一个替换字符(很多平台就是?)
数据库字符集,在和客户端NLS_LANG不同时,会把经过NLS_LANG转换的字符进行进一步处理
对于?(即不存在对应关系的字符)直接以?形式存放入数据库
对于其他字符,在NLS_LANG和数据库字符集之间进行转换后存入。