SQL错误:ORA-12712:新字符集必须是旧字符集的超集

时间:2011-09-08 17:43:40

标签: oracle utf-8

我想将oracle数据库的字符集从'WE8MSWIN1252'更改为'AL32UTF8'

我尝试从链接执行以下步骤(http://download.oracle.com/docs/cd/B10501_01/server.920/a96529/ch10.htm#1009580):

  

使用SHUTDOWN IMMEDIATE或a关闭数据库   SHUTDOWN NORMAL语句。执行数据库的完整备份,因为   ALTER DATABASE CHARACTER SET语句无法回滚。   填写以下声明:

STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET AL32UTF8;

但是当我执行上述语句时,我收到以下错误

SQL错误:ORA-12712:新字符集必须是旧字符集的超集

任何人都可以帮我解决这个问题。

4 个答案:

答案 0 :(得分:9)

要成功执行ALTER DATABASE CHARACTER SET语句,必须满足两个条件:

  • 当前字符集中的每个字符都可用于新字符集。
  • 当前字符集中的每个字符在新字符集中具有相同的代码点值。 (即:旧的字符集必须是新字符集的子集)

由于WE8MSWIN1252不是AL32UTF8的严格子集,因此此语句将失败(例如:A3中的英镑符号为WE8MSWIN1252,但{{1}它是AL32UTF8)。

您需要使用C2 A3来执行此迁移。

请参阅:Character Set Migration.

答案 1 :(得分:1)

最简单的方法:(关机必要)

首先,以sysdba身份连接:

sqplus / as sysdba

接下来,执行以下脚本:

alter system set nls_length_semantics=CHAR scope=both;
shutdown;
startup restrict;
alter database character set INTERNAL_USE WE8ISO8859P1;
shutdown;
startup;

它在Oracle 12c标准二版中对我有用

取自:http://www.blogdelpibe.com/2015/05/como-solucionar-el-error-ora-12899.html

答案 2 :(得分:1)

代替第6行

ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;

这解决了我的问题。

答案 3 :(得分:0)

以下在19C为我工作。

问题

以AL32UTF8字符集和AL16UTF16 NCHAR字符集完成导入 以WE8MSWIN1252字符集和AL16UTF16 NCHAR字符集完成导出 警告:字符集转换中可能会丢失数据

步骤

数据库以限制模式启动。

SQL>从nls_database_parameters中选择*,其中parameter ='NLS_CHARACTERSET';

参数

VALUE

NLS_CHARACTERSET AL32UTF8

SQL> alter database character set WE8MSWIN1252; 更改数据库字符集WE8MSWIN1252 * 第1行发生错误: ORA-12712:新字符集必须是旧字符集的超集

SQL>更改数据库字符集INTERNAL_USE WE8MSWIN1252;

数据库已更改。

SQL>从nls_database_parameters中选择*,其中parameter ='NLS_CHARACTERSET';

参数

VALUE

NLS_CHARACTERSET WE8MSWIN1252

SQL>

干杯! RaJ ...