oracle817字符集,Oracle817 版本 不同字符集之间的数据库导入

Oracle817   版本   不同字符集之间的数据库导入

由于业务原因,需要将一英文字符集(American_America.WE8ISO8859P1)的数据库DMP文件导入到一中文字符集(SIMPLIFIED   CHINESE_CHINA.ZHS16GBK)的数据库中。由于字符集的不同,需要将中文字符集的数据库环境改变成英文字符集。遇到很多的麻烦,通过在网上查找资料,终于解决了问题。在这个过程中,发现网友们也有同样的问题,为了,让大家在以后能够顺利的完成此类工作,现将把我导入成功的过程写出来,与大家共享。

一、系统环境:

导出环境:

主机:Compaq   小型机

操作系统:Unix

数据库:oracle8.1.7{英文字符集(American_America.WE8ISO8859P1)}

导入环境:

主机:普通Pc   机

主频:PIII750

内存:192M

操作系统:Windows   2000   server

数据库:Oracle8.1.7中文字符集(SIMPLIFIED   CHINESE_CHINA.ZHS16GBK)

注:导出过程省略

二、导入过程

1、     将win2000系统中的oracle注册表

[HKEY_LOCAL_MACHINESOFTWAREORACLE]中的[NLS_LANG]键值

“SIMPLIFIED   CHINESE_CHINA.ZHS16GBK”改成

“American_America.WE8ISO8859P1”

2、     用system用户的身份,在Sql-plus   下执行以下语句:

update   sys.props$   set   value$='WE8ISO8859P1'   where   name='NLS_CHARACTERSET';

update     sys.props$   set   value$='WE8ISO8859P1'   where   name='NLS_NCHAR_CHARACTERSET';

commit;

3、     重新启动oracle

4、     开始导入数据库

userid   =   用户名/密码@连结串

buffer   =   60000

log   =   c:dmp.log

file   =   c:导入数据文件名称.dmp

fromuser   =   用户名

touser   =   用户名

这里要注意,要确保导入的表空间和用户已经建立并与导出文件一至,还要确认用户是否拥有dba的权限,否则有可能会影响导入数据的完整。

5、     检查导入效果,在目前环境下,测试数据是否正确,是否有乱码,是否有未成功导入的表和其他触发器、过程和函数等信息。确认导入没有问题后,进入到下一步。

6、     将win2000下oracle字符集环境恢复成中文字符集。

[HKEY_LOCAL_MACHINESOFTWAREORACLE]中的[NLS_LANG]键值

“American_America.WE8ISO8859P1”   改回

“SIMPLIFIED   CHINESE_CHINA.ZHS16GBK”

7、     用system用户的身份,在Sql-plus   下执行以下语句:

update   sys.props$   set   value$='   ZHS16GBK   '   where   name='NLS_CHARACTERSET';

update     sys.props$   set   value$='   ZHS16GBK   '   where   name='NLS_NCHAR_CHARACTERSET';

commit;

8、     重新启动数据库。

检查你的数据库中的数据,如果没有乱码,而且你的程序能够在这个环境下正常运行,那么恭喜你,你也成功了!!

Top

2 楼wylwyl1130(落雪山林)回复于 2004-09-08 16:28:35 得分 5

给你一个例子,修改一下字符集就可以了

用编辑方式打开导出的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字符集的数据库就可以了。Top

3 楼zhihaitao(云-松-)回复于 2004-09-08 17:03:19 得分 5

好好学习,天天向上Top

4 楼daydayupliq(敞开胸怀!)回复于 2004-09-08 17:10:15 得分 5

from   csdn.net

使用一点点技巧,就可以使导出/导入在不同的字符集的数据库上转换数据。这里需要一个2进制文件编辑工具即可,如uedit32。用编辑方式打开导出的dmp文件,获取2、3字节的内容,如00   01,先把它转换为10进制数,为1,使用函数NLS_CHARSET_NAME即可获得该字符集:(ultraedit   打开几百M到上G的文件很慢,我试了winHex,哪个速度啊,闪电!)

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字符集的数据库就可以了。(注意,十进制数与十六进制之间的转换,想明白其中的道理)

SQL>   select   nls_charset_id('zhs16cgb231280')   from   dual;

NLS_CHARSET_ID('ZHS16CGB231280')

--------------------------------

850

字符集                         代码(十进制)       对应的dmp文件(2、3字节/二进制)

ZHS16CGB231280         850                             03   52

ZHS16GBK                     852                             03   54

以前一直用oracle8.0.5     ,     安装好     oracle8.1.6         后发现SQL*Plus可以用,SQL*WorkSheet     总出现乱码,改了字符集也不对

---------------------------------------------------------------

解决办法:

在$ORACLE_HOMEsysmanconfig目录下有一个配置文件名为dbappscfg.properties,找到这样一项,#SQLPLUS_NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

去掉注释符#,同时将其修改为SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

对于Windows操作系统,还需要修改一项,在文件中找到#     SQLPLUS_SYSTEMROOT=c:\WINNT40,去掉注释符,将其修改为你所在机器的操作系统主目录。如操作系统的主目录在D盘的Winnt下,则将其修改为     SQLPLUS_SYSTEMROOT=d:\WINNT。

修改完成后,保存文件,退出编辑。重新连接SQL     PLUS     Worksheet,OK!

---------------------------------------------------------------

对于Oracle     Enterprise     Manager中的所有工具,有一个配置文件名为dbappscfg.properties,修改该文件即可解决上述问题。这个文件的位置在$ORACLE_HOMEsysmanconfig目录下,用任何的文本编辑器打开该文件,在这个文件里面,找到这样一项,

#     SQLPLUS_NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

去掉注释符#,同时将其修改为SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK。

对于Windows操作系统,还需要修改一项,在文件中找到#     SQLPLUS_SYSTEMROOT=c:\WINNT40,去掉注释符,将其修改为你所在机器的操作系统主目录。如操作系统的主目录在D盘的Winnt下,则将其修改为     SQLPLUS_SYSTEMROOT=d:\WINNT。

对于后面一项的修改只对Windows操作系统进行,对UNIX操作系统则不需要。如果在Windows操作系统中不修改该项,在Oracle     Enterprise     Manager中,连接系统时,会提示如下的错误:

ORA-12560     TNS:protocol     adapter     error

或者

ORA-12545     Connect     failed     because     target     host     or     object     does     not     exist

修改完成后,保存文件,退出编辑。重新连接SQL     PLUS     Worksheet,字符集乱码问题得到解决,显示正确的简体中文字符集。

Top

5 楼LGQDUCKY(飘)回复于 2004-09-08 18:15:16 得分 5

修改下目的(ORACLE9)的数据库字符级,就能导入

sqlplus   /nolog

sql>conn     /as   sysdba

sql>update   sys.props$   set   value$='ZHS16GBK'   where   name='NLS_CHARACTERSET';

sql>update     sys.props$   set   value$='   ZHS16GBK   '   where   name='NLS_NCHAR_CHARACTERSET';

sql>commit;

重新启动数据库,然后执行IMPTop

6 楼zwj0712(阿张)回复于 2004-09-08 18:49:42 得分 5

还是楼上的强啊!!!Top

7 楼godblessu(上帝保佑)回复于 2004-09-09 09:04:17 得分 0

大侠们   且慢且慢

我导进去了   只是有些记录的某些字段超长了

所以想知道两个字符集是怎么算字符长度的

谢谢Top

8 楼LGQDUCKY(飘)回复于 2004-09-09 09:11:07 得分 20

英文字符级一个中文算一个字节,中文字符级中文算两个字节Top

9 楼godblessu(上帝保佑)回复于 2004-09-09 09:14:05 得分 0

那样的话   我将中文字符集的dmp导入到utf8的数据库中   怎么会说超长呢?Top

10 楼lq1600k(打印机)回复于 2004-09-10 15:58:09 得分 50

utf8一个汉字3bytes   utf16一个汉字4bytes

==============================

UTF8   characters   occupy   up   to   3   bytes.   AL32UTF8   (Oracle9i   only)   characters   occupy   up   to   4   bytes.

4   bytes   are   only   for   characters   allocated   in   Unicode   3.1,   not   yet   supported   by   Oracle,   and   user-defined   characters   from   Private   Use   area   above   U+0000FFFF.   Four   bytes   they   are   not   yet   practically   used.

Chinese   and   Japanese   characters   occupy   3   bytes   in   UTF8.   Due   to   Han   unification   in   Unicode   there   is   no   distinction   between   Chinese   and   Japanese   ideographs,   if   they   are   the   same   character   (like   the   Chinese   character   for   "center",   appearing   in   the   word   "China",   and   used   in   Japanese   as   well).   You   have   to   distinguish   between   languages   on   the   application   level   (e.g.   extra   column).

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值