——————感谢做者,确实解决了问题。分享下,但愿帮到更多人html
此问题发生在数据库迁移过程当中。源数据库:本身笔记本上win7 64位系统的oracle11g我的版,字符集ZHS16GBK ;目标数据库,HP的sqlserver2008 系统 64位数据库服务器,字符集AL32UTF8 。java
今天下午在部署HP的一台数据库服务器时,装的oracle11g 企业版默认字符集为AL32UTF8,sql
而我本地电脑装的oracle11g 我的版数据库字符集server端默认是ZHS16GBK,因此在我把我本机导出的数据库.dmp文件导入到Hp的数据库时,报数据库
imp错误而且错误描述信息为中文乱码。而后通过我上网查阅资料得知 若是要解决乱码问题必须知足下面条件:服务器
目标数据库的服务端和客户端字符集以及要从我本地导入源数据库的dmp文件中的字符集格式必须同样。而我本地源数据库字符集是ZHS16GBK,目标服务器端字符集是AL32UTF8 ,显然不知足以上条件。oracle
而后我首先尝试下面方式更改HP服务器数据库字符:sqlserver
尝试方法一:在sys/sys 下面执行下面语句:(失败)测试
注:SQL> alter database CHARACTER SET ZHS16GBK;
alter database CHARACTER SET ZHS16GBK
结果报下面错误:
ERROR 位于第 1 行:
ORA-12712: 新字符集必须为旧字符集的超集。spa
注:超集解释:若是s1集合包含s2集合中的每个元素,而且s1集合中有可能包含s2集合中不含有的元素时,那么称s1是s2的超级。说明AL32UTF8包含ZHS16GBK。code
尝试方法二:用scott/tiger 登录 sqlplus 而后connect sys/sys as sysdba,而后输入命令便可,文中标红的请用本身设置的密码。(此方法测试后成功!)
而后在sqlplus界面依次执行如下sql语句:
若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器,而后执行如下命令:注:每条sql语句都会有相应的提示,请输入时务必仔细。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
SQL>STARTUP MOUNT;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=
0
;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=
0
;
SQL>ALTER DATABASE OPEN;
SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
//跳过超子集检测
SQL>ALTER DATABASE national CHARACTER SET INTERNAL ZHS16GBK;
|
这一行不起做用,执行后出错ORA-00933: SQL 命令未正确结束,不过执行上一行命令已经生效,其余文章里未提到本行。
1
2
3
4
|
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP
|
最后重启oracle11g监听和服务,从新登陆PL/SQL developer ,
执行select userenv('language') nls_lang from dual; 发现目标数据库字符集以下,已经正确修改成SIMPLIFIED 。CHINESE_CHINA.ZHS16GBK。
NLS_LANG
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
而后再执行相应的imp ldpssts/ldpssts@orcl fromuser=lspss touser=ldpssts file=D:\imp\ldpssts.dmp log=D:\imp\ldpssts.log ,导入执行成功。