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

问题描述 投票:0回答:5

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

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

使用 SHUTDOWN IMMEDIATE 或 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:新字符集必须是旧字符集的超集

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

oracle utf-8
5个回答
10
投票

要成功执行

ALTER DATABASE CHARACTER SET
语句,必须满足两个条件:

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

因为

WE8MSWIN1252
不是
AL32UTF8
的严格子集,此语句将失败(例如:在
A3
中,英镑符号在十六进制中是
WE8MSWIN1252
,但在
AL32UTF8
中它是
C2 A3
)。

您需要使用

CSALTER
来执行此迁移。

参考:字符集迁移。


5
投票

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

首先,以 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 标准第二版中对我有用

取自:https://www.elblogdelpibe.com/2015/05/como-solucionar-el-error-ora-12899.html(更新的网址)


3
投票

以下在 19C 为我工作。

问题

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

步骤

数据库以限制模式启动。

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

参数

价值

NLS_CHARACTERSET AL32UTF8

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

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

数据库已更改。

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

参数

价值

NLS_CHARACTERSET WE8MSWIN1252

SQL>

干杯! 拉杰...


1
投票

将第 6 行替换为

ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;

这解决了我的问题。


0
投票

con 11g 功能 更改系统设置 nls_length_semantics=CHAR 范围=两者; 关闭;启动限制;更改数据库字符集 INTERNAL_USE WE8ISO8859P1;关闭;启动;

© www.soinside.com 2019 - 2024. All rights reserved.