问题:数据库字符集不同,导致字节不同,导致无法将数据库1中的大字段内容导入到数据库2中。
字符集描述:
数据库1:GBK格式
数据库2:UTF-8格式
需求:将数据库1中的数据导入到数据库2中。
解决办法:
第一种解决办法:
1)查询数据库字符集
SELECT值$ FROM sys.props $ WHERE name ='NLS_CHARACTERSET';
2)更改数据库字符集:
将数据库环境字符集的AL32UTF8,换为ZHS16GBK
first: 以sysdba的身份登录上去 conn /as sysdba
second: 关闭数据库shutdown immediate;
three: 以mount打来数据库,startup mount
four: 设置session
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
five: 启动数据库
alter database open;
sex: 修改字符集
ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
seven: 关闭,重新启动
SQL>shutdown immediate;
SQL> startup
第二种方法:(不推荐,浪费时间)
1)将数据库1中的新建表结构复制过来,更改表字段长度,如:
数据库1:用户varchar2(100) - “改成:数据库2:用户varchar2(200)
注:具体改多大,自定义。
更改数据库1中的所有属性长度之后,然后在数据库2中直接创建新表,命名自定。
2)然后导出数据库1中的某个表的数据:
exp scott / 123456 file = C:/Users/Administrator/Desktop/reg_app_info.dmp tables = reg_app_info
3)在数据库2中导入该表的数据:
imp scott / 123456 file = C:/Users/Administrator/Desktop/reg_app_info.dmp tables = reg_app_info ignore = y
注意(重点):加忽略= Y,
ignore = y如果没有表,创建并倒入数据,如果已经有的表,忽略创建的,但不忽略倒入。
4)在数据库2里面新建的表中查询数据,可看到数据已经成功导入到更改表字段属性之后的表里面了。(测试我已过,如有任何问题,请评论,我看到后会第一时间回复)
5)EXP / IMP在本地和数据库本机服务器上都是可以导入导出的,(之前不是特别的熟悉)。
6)附上新建数据库并赋权SQL:
select * from dba_users,其中username = upper(replace('gsnews_operation','',''));
创建
由gsnews_operation
默认表空间USERS标识的用户gsnews_operation;
grant connect to gsnews_operation;
将ctxapp授予gsnews_operation;
向gsnews_operation授予资源;
将创建视图授予gsnews_operation;
将创建过程授予gsnews_operation;
将创建序列授予gsnews_operation;
将创建类型授予gsnews_operation;
grant create gsnews_operation的同义词;
将exp_full_database授予gsnews_operation;
将alter system授予gsnews_operation;