数据库导入中的字符集转换问题?请教

snake1122 2004-01-14 10:37:48
日文系统下的Oracle9导出数据,导入中文Oracle9出现错误:不支持要求的字符集转换(从类型832到852)—--IMP-00016,用Set NLS_LANG = simplified chinese_china.UTF8依然不好使,请教用什么办法才能导入数据?
...全文
84 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
baojianjun 2004-01-15
  • 打赏
  • 举报
回复
导出/导入与字符集
明白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字符集的数据库就可以了。(注意,十进制与十六进制之间的转换,想明白其中的道理)
isaacchang 2004-01-15
  • 打赏
  • 举报
回复
同意楼上的。
zcs_1 2004-01-15
  • 打赏
  • 举报
回复
应该修改nls_lang。
那我建议你另外创建一个日文字符集的数据库,将数据导入到这个数据库中,然后用中文字符集的客户端连接上导出数据。
snake1122 2004-01-14
  • 打赏
  • 举报
回复
我这边字符集是UTF8,它的超集是什么?
lianhg 2004-01-14
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2604/2604811.xml?temp=9.655398E-02
zcs_1 2004-01-14
  • 打赏
  • 举报
回复
select nls_charset_name(832) from dual;

NLS_CHAR
--------
JA16SJIS

select nls_charset_name(852) from dual;

NLS_CHAR
--------
ZHS16GBK


建议用中文的客户端连接日文字符集数据库导出数据,这样就可以导入到中文字符集数据库了。
snake1122 2004-01-14
  • 打赏
  • 举报
回复
用Janpanese_janpan_utf8也不好使
snake1122 2004-01-14
  • 打赏
  • 举报
回复
类型832是什么?852又是什么?从哪儿能找到他们相关的定义?

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧