我想将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:新字符集必须是旧字符集的超集
任何人都可以帮我解决这个问题吗?
要成功执行
ALTER DATABASE CHARACTER SET
语句,必须满足两个条件:
因为
WE8MSWIN1252
不是 AL32UTF8
的严格子集,此语句将失败(例如:在 A3
中,英镑符号在十六进制中是 WE8MSWIN1252
,但在 AL32UTF8
中它是 C2 A3
)。
您需要使用
CSALTER
来执行此迁移。
参考:字符集迁移。
最简单的方法:(需要关机):
首先,以 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(更新的网址)
导入以 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>
干杯! 拉杰...
将第 6 行替换为
ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
这解决了我的问题。
con 11g 功能 更改系统设置 nls_length_semantics=CHAR 范围=两者; 关闭;启动限制;更改数据库字符集 INTERNAL_USE WE8ISO8859P1;关闭;启动;