oracle 11g更改字符集

本文介绍了解决Oracle11g导入数据时因字符集不匹配导致的错误方法。通过详细步骤展示了如何从AL32UTF8更改为ZHS16GBK字符集,包括数据库的启动模式调整、参数设置及注意事项。

oracle 11g更改字符集

工作需要,安装装了oracle 11g,在导入其他机器上的备份数据的时间,发生一个错误:

IMP-00019: 由于 ORACLE 错误 12899 而拒绝行
IMP-00003: 遇到 ORACLE 错误 12899
ORA-12899: 列 "ZHENG"."D_DIC"."DICEXPLAIN" 的值太大 (实际值: 140, 最大值: 100)

这个数据表结构是直接注入的,根本不会这样子的啊。后来在网上查了才知道原来是字符集的问题:

在日志文件里,开始导入时候有这样一个提示:"

已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
导入服务器使用 AL32UTF8 字符集 (可能的字符集转换)

"原来在我的Windows server 2003系统上安装oracle,默认的字符集跟操作系统一致,是AL32UTF8。

AL32UTF8里,一个汉字是占用3个字符位,而一般我们用Windows XP中默认的是ZHS16GBK ,一个汉字用2个字符位。这样,直接导入数据就直接溢出了。

在网上找到一个修改字符集的方法:


SQL> conn sys/sys as sysdba;
SQL> shutdown immediate;
SQL> STARTUP MOUNT;
SQL> ALTER SESSION SET SQL_TRACE=TRUE;
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 ZHS16GBK;

SQL> Shutdown immediate;
SQL> startup;oracle数据库的字符集更改
A、oracle server端字符集查询
select userenv(‘language’) from dual
其中NLS_CHARACTERSET 为server端字符集
NLS_LANGUAGE 为 server端字符显示形式
B、查询oracle client端的字符集
$echo $NLS_LANG
如果发现你select 出来的数据是乱码,请把client端的字符集配置成与linux操作系统相同的字符集。如果还是有乱码,则有可能是数据库中的数据存在问题,或者是oracle服务端的配置存在问题。
C、server端字符集修改 (这步验证是OK的)
*****************************************************************
* 更改字符集步骤方法(WE8ISO8859P1 --> ZHS16GBK)            *
*****************************************************************
SQL>
将数据库启动到RESTRICTED模式下做字符集更改:
SQL> conn /as sysdba
Connected.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 236000356 bytes
Fixed Size                   451684 bytes
Variable Size             201326592 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
Database mounted.
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
System altered.
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
System altered.
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
System altered.
SQL> alter database open;
Database altered.
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
ALTER DATABASE CHARACTER SET ZHS16GBK
*
ERROR at line 1:
ORA-12712: new character set must be a superset of old character set
提示我们的字符集:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改:
SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
Database altered.
SQL> select * from v$nls_parameters;

19 rows selected.
重启检查是否更改完成:
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 236000356 bytes
Fixed Size                   451684 bytes
Variable Size             201326592 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
Database mounted.
Database opened.
SQL> select * from v$nls_parameters;

19 rows selected.
我们看到这个过程和之前ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使
Oracle数据库绕过了子集与超集的校验.
这一方法在某些方面是有用处的,比如测试;应用于产品环境大家应该格外小心,除了你以外,没有人会为此带来的后果负责:
结语(我们不妨再说一次):
对于DBA来说,有一个很重要的原则就是:不要把你的数据库置于危险的境地!
这就要求我们,在进行任何可能对数据库结构发生改变的操作之前,先做有效的备份,很多DBA没有备份的操作中得到了惨痛的教训
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
D、client端字符集修改
在 /home/oracle与 /root用户目录下的.bash_profile中
添加或修改 export NLS_LANG="AMERICAN_AMERICA.UTF8" 语句
关闭当前ssh窗口。
注意 NLS_LANG变量一定要配置正确否则会引起sqlplus 失效 本篇文章来源于:开发学院 http://edu.codepub.com   原文链接:http://edu.codepub.com/2010/0601/23155.php

### 修改 Oracle 11g 数据库字符集的方法 在 Oracle 11g 中更改数据库字符集是一个复杂的过程,因为这涉及到现有数据的重新编码以及可能的数据丢失风险。以下是关于如何安全地执行此操作的相关信息。 #### 字符集变更的前提条件 为了成功更改数据库字符集,必须满足以下前提条件: - 确认当前数据库中的所有数据可以无损转换到目标字符集。 - 使用 `csalter.plb` 脚本之前,运行 `CSSCAN` 工具扫描整个数据库以验证兼容性[^4]。 #### 步骤概述 虽然不建议直接通过命令修改字符集,但如果确实需要调整,则应遵循官方推荐流程: 1. **确认当前字符集** 可以查询视图 `NLS_DATABASE_PARAMETERS` 来获取当前使用的字符集设置。 ```sql SELECT parameter, value FROM nls_database_parameters WHERE parameter LIKE '%CHARACTERSET%'; ``` 2. **准备 CSSCAN 扫描工具** 下载并安装适用于版本的 CSSCAN 实用程序。该工具会分析表空间内的每一列,并报告哪些字段无法正确映射至新字符集中[^5]。 3. **应用 csalter.plb 脚本** 如果扫描结果显示没有不可逆的风险,则可继续使用脚本来完成实际切换过程。注意备份完整的生产环境后再尝试任何写入动作! 运行如下语句加载必要的存储过程定义文件: ```bash @$ORACLE_HOME/rdbms/admin/csalt.sql @?/rdbms/admin/csaltaltr.sql ``` 4. **正式更新配置参数** 当一切就绪之后,调用 ALTER SESSION SET CONTAINER=... 或者直接进入 PDB 容器模式下发出指令改变全局默认值: ```sql EXEC DBMS_CSALTER.ALTER_DATABASE_CHARACTER_SET('AL32UTF8'); ``` 上述方法仅作为理论指导用途,在真实场景里务必谨慎对待每一次改动行为以免造成业务中断或者永久损坏重要资料的情况发生。 ```sql -- 查询当前字符集 SELECT parameter, value FROM nls_database_parameters WHERE parameter LIKE '%CHARACTERSET%'; -- 加载CSALTER脚本 @$ORACLE_HOME/rdbms/admin/csalt.sql; @?/rdbms/admin/csaltaltr.sql; -- 更新字符集(假设为目标 AL32UTF8) EXEC DBMS_CSALTER.ALTER_DATABASE_CHARACTER_SET('AL32UTF8'); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值