对于8i以上产品,可以采用“Alter database character set 字符集”来修改数据库的字符集(子集到超集),对于你的问题,是不是可以先做完整的数据库导出,用想要的字符集重建一个库,然后编辑一下导出文件,再导入到新库中。
修改方法:
需要一个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字符集的数据库就可以了。
修改方法:
需要一个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字符集的数据库就可以了。
http://www.ncn.cn/oracle/admin/nls_convert1.htm
http://www2.ccw.com.cn/tips/9906/062804_04.asp
这个帖子让我都晕了
SVRMGR> SHUTDOWN IMMEDIATE;
SVRMGR> STARTUP MOUNT;
SVRMGR> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SVRMGR> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SVRMGR> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SVRMGR> ALTER DATABASE OPEN;
SVRMGR> ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
SVRMGR> ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE ZHS16GBK;
SVRMGR> SHUTDOWN IMMEDIATE;
SVRMGR> STARTUP RESTRICT;
SVRMGR> SHUTDOWN IMMEDIATE;
SVRMGR> STARTUP
我用以下解决了这个问题
SVRMGRL
SVRMGRL>CONNECT INTERNAL/ORACLE
SVRMGRL>SHUTDOWN IMMEDIATE;
SVRMGRL>STARTUP
SVRMGRL>UPDATE PROPS$ SET VALUE$='ZHS16GBK' WHERE NAME LIKE 'NLS_CHAR%';
SVRMGRL>connect internal
SVRMGRL>SHUTDOWN IMMEDIATE;
SVRMGRL>STARTUP
我执行你给我的语句,到了
ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK; 执行后
提示ORA-12710 大概中文的意思就是“新的字符集必须有个旧的设置”
后来我执行ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE ZHS16GBK; 这句也同样的错误。
望高手指点一二
ORA-12710 :new character set must be a superset of old characterset
ALTER DATABASE CHARACTER SET ZHS16GBK;
对于8i以下版本是否能用,我不知道。你试试
提示是:新字符集必须是旧字符集的超集,
而ZHS16GBK就是US7ASCII的超集。
这个命令据说8I以上版本支持,前面我说的方法
你试了吗,不行吗?
PS:千万不要改动PROPS$表.
就是这个错误啊。好像805的就是不行啊。。:(而且,你说的导出文件是不是只是针对于逻辑备份?在一台新机子上装805,用中文字符集。在旧机子上是805的US7ASCII版本,把其做冷备份(逻辑备份不全),然后导到新的机子上,是不是字符集还是US7ASCII了?怎么才能变成中文的?
现在给你几点建议:
1、升级805到8i最好是8.1.6以上,然后通过Alter database character set 字符集;更改字符集。
2、继续在网上提问,寻求直接更改805字符集的方法。
3、作一个按模式的导出(包括你所有的业务数据),更改导出文件的字符集(方法如上),使用新的字符集重建一个数据库。然后导入到新库中。注意如果你在客户端运行导出,最好将客户端的NLS_LANG中的字符集设置于服务器一致。
比如导出时:
服务器端:US7ASCII 客户端:nls_lang=American_America.US7ASCII
导入时:
服务器端:zhs16gbk 客户端:nls_lang=simplified chinese_china.zhs16gbk
这个方法我做过多次试验,均成功。
最后提醒,做实验前,都要留备份。