oracle imp字符集问题的解决
2009-07-29 09:22
316 查看
问题:
在imp一个dmp文件的时候,提示不支持要求的字符集转换(从类型850到852).
原理:
Oracle多国语言设置是为了支持世界范围的语言与字符集,一般对语言提示,货币形式,排序方式和CHAR,VARCHAR2,CLOB,LONG字段的数据的显示等有效。ORACLE的多国语言设置最主要的两个特性就是国家语言设置与字符集设置,国家语言设置决定了界面或提示使用的语言种类,字符集决定了数据库保存与字符集有关数据(如文本)时候的编码规则。
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字符集的数据库就可以了。
在imp一个dmp文件的时候,提示不支持要求的字符集转换(从类型850到852).
原理:
Oracle多国语言设置是为了支持世界范围的语言与字符集,一般对语言提示,货币形式,排序方式和CHAR,VARCHAR2,CLOB,LONG字段的数据的显示等有效。ORACLE的多国语言设置最主要的两个特性就是国家语言设置与字符集设置,国家语言设置决定了界面或提示使用的语言种类,字符集决定了数据库保存与字符集有关数据(如文本)时候的编码规则。
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字符集的数据库就可以了。
相关文章推荐
- oracle imp字符集问题的解决
- oracle imp字符集问题的解决
- oracle imp,exp时字符集问题的解决
- oracle imp字符集问题的解决
- 解决Oracle中字符集导致一个汉字占用3个字节的问题
- 解决Oracle客户端和服务端字符集匹配问题
- oracle 字符集乱码解决 详细解释了oracle字符集的问题
- oracle exp/imp 遇到EXP-00091 错误问题解决.
- 修改ORACLE客户端字符集编码解决中文乱码问题
- 【EXP-00091】Oracle 字符集问题解决
- Oracle数据导入时,字符集问题解决
- jira与oracle字符集不一致问题解决
- Oracle 中用 imp 和 exp 命令导入导出数据库(附问题及解决办法)
- 解决ORACLE字符集为US7ASCII,插入数据中文乱码问题
- Oracle 管道 解决Exp/Imp大量数据处理问题
- oracle imp导入数据乱码问题的解决
- Oracle 中用 imp 和 exp 命令导入导出数据库(附问题及解决办法)
- 解决oracle Array字符集问题的调试手记.
- Oracle 8i字符集乱码问题析及其解决办法
- Exp Imp 导入导出常见问题解决方法-字符集的后续问题