oracle exp 导出字符集,oracle exp/imp 字符集

使用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

在导出操作时,非常重要的是客户端的字符集设置,也就是客户端的NLS_LANG设置。

NLS_LANG参数由以下部分组成:

NLS_LANG=_.

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和数据库字符集之间进行转换后存入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值