美创科技技术社区

注册

 

发新话题 回复该主题

Export和Import字符集转换 [复制链接]

1#

Export和Import过程中需要进行字符集转换,也经常会由于字符集无法转换或者字符集不兼容引起字符混乱。以下对字符集转换做一描述。

字符集转换涉及以下部分:数据库的字符集,数据库的国际字符集,export或者import会话的字符集设置(NLS_LANG)。四种字符集在交互过程中需要相互转换,并且具有一定的规则。

在Export过程中,首先数据库字符集转换成数据库国际字符集,然后转换成export会话的字符集。Export会话的字符集由环境变量NLS_LANG指定,缺省为USASCII7。如果需要指定其他字符集,需要设置ORA_NLS33(oracle 8 high)或者ORA_NLS32(pre Oracle 8)。数据库字符集和国际字符集可以用以下语句获得:select * from sys.props$。经过几次转换在export dump文件中存储的是export session指定的NLS_LANG。在export过程中如果发现字符集无法兼容会过滤相应的字符,比如从中文字符集转换到US7ASCII,将会引起中文字符紊乱。

在Import过程中遵循相反的过程。由export dump文件中的字符集转换成import session指定的字符集,然后在依次转换成数据库国际字符集和数据库字符集。同样import session字符集由 NLS_LANG环境变量指定。由export dump文件到import session字符集的相互转换只能在单字节字符集之间进行,双字节字符集无法进行转换。同样不兼容的字符集转换将会引起字符紊乱,尤其是中文字符集。

有时候我们无法知道export dump文件中的字符集设置。这个时候可以直接查看dump文件获知字符集设置。Dump文件中字符集以字符集ID号存储,第二和第三字节组合起来就是字符集的ID号(16进制)。用以下命令查看:cat expdat.dmp|od –x|hea。以下是例子:

0000000 0300 0145 5850 4f52 543a 5630 382e 3031

0000020 2e30 3646 0a44 5359 530a 5254 4142 4c45

可以看出第二个字节为0×00,第三个字节为0×01,组合的结果为0×0001。该值为US7ASCII的ID号。又如:0000000 0303 5245 5850 4f52 543a 5630 382e 3031

0000020 2e30 3646 0a44 5359 530a 5254 4142 4c45

0000040 530a 3430 3936 0a30 0a32 380a 3430 3030

可以看出第二个字节为0×03,第三个字节为0×52,组合的结果为0×0352。该值为zhs16cgb231280字符集的ID号。以下是一些常用的字符集ID号设置:

Name ID

———————-

US7ASCII 0×0001

WE8DEC    0×0002

WE8ISO8859P1 0×001f

EE8ISO8859P2 0×0020

SE8ISO8859P3 0×0021

NE8ISO8850P4 0×0022

CL8ISO8859P5 0×0023

AR8ISO8859P6 0×0024

EL8ISO8859P7 0×0025

IW8ISO8859P8 0×0026

WE8ISO8859P9 0×0027

TH8TISASCII 0×0029

WE8ROMAN8 0×0005

WE8PC850 0×000a

US8PC437 0×0004

EE8PC852 0×0096

EE8MSWIN1250 0×00aa

CL8MSWIN1251 0×00ab

EL8MSWIN1253 0×00ae

WE8MSWIN1252 0×00b2

JA16EUC   0×033e

JA16SJIS 0×0340

ZHT16BIG5  0×0361

Zhs16cgb231280 0×0352

Zhs16gbk 0×0354

分享 转发
TOP
发新话题 回复该主题