Oracle 修改字符集(AL32UTF8 转换成UTF8字符集)

有的时候我们在迁移数据库的时候发现由于字符集的问题导致迁移不成功,比如之前做expdp/imdp迁移的时候 ,

源库是UTF8字符集,目的库是AL32UTF8字符集,由于汉字在AL32UTF8 中占3个字节,而在ZHS16GBK中占2个字节,

这样在导入的时候就会遇到:

今天测试的是将AL32UTF8 转换成UTF8字符集

测试环境
系统:Windows
数据库:Oracle 11g

1.首先检查环境

C:\Users\Administrator>sqlplus  / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期五 12月 8 08:36:25 2017

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> spool 2017_12_08.txt
SQL> set line 4000
SQL> select userenv('language') from dual;

USERENV('LANGUAGE')
--------------------------------------------------------------------------------------------------------
SIMPLIFIED CHINESE_CHINA.AL32UTF8

SQL> select * from v$nls_parameters;

PARAMETER                                                                                                                VALUE
-------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
NLS_LANGUAGE                                                                                                             SIMPLIFIED CHINESE
NLS_TERRITORY                                                                                                            CHINA
NLS_CURRENCY                                                                                                             ¥
NLS_ISO_CURRENCY                                                                                                         CHINA
NLS_NUMERIC_CHARACTERS                                                                                                   .,
NLS_CALENDAR                                                                                                             GREGORIAN
NLS_DATE_FORMAT                                                                                                          DD-MON-RR
NLS_DATE_LANGUAGE                                                                                                        SIMPLIFIED CHINESE
NLS_CHARACTERSET                                                                                                         AL32UTF8
NLS_SORT                                                                                                                 BINARY
NLS_TIME_FORMAT                                                                                                          HH.MI.SSXFF AM

PARAMETER                                                                                                                VALUE
-------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
NLS_TIMESTAMP_FORMAT                                                                                                     DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT                                                                                                       HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT                                                                                                  DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY                                                                                                        ¥
NLS_NCHAR_CHARACTERSET                                                                                                   AL16UTF16
NLS_COMP                                                                                                                 BINARY
NLS_LENGTH_SEMANTICS                                                                                                     BYTE
NLS_NCHAR_CONV_EXCP                                                                                                      FALSE

已选择19行。

 

2.执行下面命令修改

 

SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area 3373858816 bytes
Fixed Size                  2180424 bytes
Variable Size            1946159800 bytes
Database Buffers         1409286144 bytes
Redo Buffers               16232448 bytes
数据库装载完毕。
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  utf8;
alter database character set  utf8
*
第 1 行出现错误:
ORA-12712: 新字符集必须为旧字符集的超集

SQL> alter database character set internal_use utf8;

数据库已更改。

SQL> alter database character set internal_convert utf8;
alter database character set internal_convert utf8
*
第 1 行出现错误:
ORA-12712: 新字符集必须为旧字符集的超集


SQL> alter database character set internal_use utf8;
alter database character set internal_use utf8
*
第 1 行出现错误:
ORA-12721: 当其他会话处于活动状态时, 无法执行操作


上面就是执行的时候容易遇到的问题,

 

关于ORA-12712报错,官网上给出使用INTERNAL_USE:具体如下:

关于ORA-12721的报错,

Oracle 修改字符集(AL32UTF8 转换成UTF8字符集)_第1张图片

最终发现在此次的操作过程中,又开了另外一个窗口,于是把该窗口关掉再次执行:

 

SQL> alter database character set internal_use utf8;

数据库已更改。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area 3373858816 bytes
Fixed Size                  2180424 bytes
Variable Size            1946159800 bytes
Database Buffers         1409286144 bytes
Redo Buffers               16232448 bytes
数据库装载完毕。
数据库已经打开。
SQL> select userenv('language') from dual;

USERENV('LANGUAGE')
--------------------------------------------------------------------------------------------------------
SIMPLIFIED CHINESE_CHINA.UTF8

SQL>

 

 

 

 

 

 

 

你可能感兴趣的:(Oracle学习笔记)