一、导出/导入在不同的字符集的数据库上转换。
需要一个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字符集的数据库就可以了。
二、修改注册表:
从旧的数据库里获得字符集的键值:
有3个地方:
HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/NLS_LANG
HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0/NLS_LANG
HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/ALL_HOMES/ID0/NLS_LANG
找到原数据库的键值,然后在新的数据库里对应的位置把键值复制过来就可以了。
这是最简单的办法了。
三、1、将windows系统中的oracle注册表
[HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE]中的[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_MACHINE/SOFTWARE/ORACLE]中的[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、重新启动数据库。