oracle查看编码格式以及修改字符集编码

oracle查看编码格式以及修改字符集编码


  1. 查看oracle数据库的编码集
    客户端字符集环境select   *   from   nls_instance_parameter,其来源于v$parameter,表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
    会话字符集环境   select   *   from   nls_session_parameter,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter   session完成,如果会话没有特殊的设置,将与nls_instance_parameter一致。
     客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter   session>环境变量>注册表>参数文件     
      字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。

这其来源于props$,这是表示数据库的字符集。
SQL> select * from nls_database_parameters;

PARAMETER
--------------------
VALUE
--------------------
NLS_CHARACTERSET
AL32UTF8


oracle客户端编码,其来源于v$parameter,表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表会话字符集环境
select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。
SQL> select * from nls_instance_parameters where parameter='NLS_LANGUAGE';

PARAMETER
--------------------
VALUE
--------------------
NLS_LANGUAGE
SIMPLIFIED CHINESE



2.修改字符集编码

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端字符集修改 

***************************************************************** 

*  更改字符集步骤方法(WE8ISO8859P1 --> ZHS16GBK)            * 

***************************************************************** 


目前我的数据库环境的字符集是AL32UTF8,那么把它改成ZHS16GBK
1.首先以sysdba的身份登录上去 conn /as sysdba
2.关闭数据库shutdown immediate;
3.以mount打来数据库,startup mount
4.设置session 


将数据库启动到RESTRICTED模式下做字符集更改: 

SQL> conn /as sysdba 

--sysdba的身份登录上去 conn /as sysdba

SQL> shutdown immediate; 

SQL> startup mount 

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; --修改字符集


ERROR at line 1: 

ORA-12712: new character set must be a superset of old character set 

这会可能会报错,提示我们的字符集:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改:

ALTER DATABASE character set INTERNAL_USE ZHS16GBK;

这条语句就可以了,TERNAL_USE提供的帮助就会使oracle绕过了子集与超集的验证,这条语句和上面的语句内部操作时完全相同的。
SQL>shutdown immediate; -- 关闭,重新启动
SQL> startup
SQL> select * from v$nls_parameters; 

client端字符集修改 

在 /home/oracle与 /root用户目录下的.bash_profile中 

添加或修改 export NLS_LANG="AMERICAN_AMERICA.UTF8" 语句 


PS:当然字符集最好不要轻易修改,因为这会对数据库的数据有直接的影响,如果是生产环境的话,可能会造成不可估计得损失。

下面提供三种解决方法: 
(1) 服务器端重新安装ORACLE 
这种情况仅仅使用于空库和具有同一种字符集的数据。 
(2)强行修改服务器端ORACLE当前字符集 
在用imp命令加载数据前,先在客户端用sql*plus登录system DBA用户,执行下列SQL语句进行当前ORACLE数据库字符集修改: 
SQL > create database character set US7ASCII 
* create database character set US7ASCII 
ERROR at line 1: 
ORA-01031: insufficient privileges 
你会发现语句执行过程中,出现上述错误提示信息,此时不用理会,实际上 
ORACLE数据库的字符集已被强行修改为US7ASCII,接着用imp命令装载数据。等数 
据装载完成以后,shutdown 数据库,再startup 数据库,用合法用户登录ORACLE 
数据库,在sql>命令提示符下,运行select * from V$NLS_PARAMETERS,可以看 
到ORACLE数据库字符集已复原,这时再查看有汉字字符数据的表时,汉字已能被正 
确显示。 
(3)利用数据格式转储,避开字符集限制 
这种方法主要用于加载外来ORACLE数据库的不同字符集数据。其方法如下: 
先将数据加载到具有相同字符集的服务器上,然后用转换工具卸出为 
foxbase 格式或access格式数据库,再用转换工具转入到不同字符集的ORACLE数 
据库中,这样就避免了ORACLE字符集的困扰。目前数据库格式转换的工具很多,象 
power builder5.0以上版本提供的pipeline,Microsoft Access数据库提供的数 
据导入/导出功能 等。转换方法参见有关资料说明。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值