乐趣区

关于oracle:Oracle字符集检查和修改

Oracle 字符集检查和批改

在部署重构版测试环境时,须要创立 Oracle 数据库,应用 dbca 创立数据库之后没有留神数据库自身的字符集,导致后续所有的数据库脚本执行后中文乱码。最初的解决办法是清掉全库数据,再批改字符集,重启数据库。

1、Oracle 字符集概述

零碎或者程序运行的环境就是一个咱们常见的 locale。而设置数据库 locale 最简略的办法就是设置 NLS_LANG 这个环境参数。在 linux 中 NLS_LANG 是一个环境变量,在 windows 中 NLS_LANG 是写在注册表中的。NLS_LANG 这个参数由三个组成部分,别离是语言(language), 区域(territory)和字符集(character set),格局如下:

NLS_LANG = language_territory.charset

咱们平时最常见的就是:AMERICAN_AMERICA.ZHS16GBKSIMPLIFIED CHINESE_CHINA.ZHS16GBK

NLS_LANG 的作用官网是这样说的:

  • It sets the language and territory used by the client application and the database server. It also sets the client’s character set, which is the character set for data entered or displayed by a client program

<!–more–>

意思就是说:

  • NLS_LANG 设置了客户端应用程序和数据库服务器应用的语言和区域。它还设置了客户端的字符集,这是 客户端程序用于数据输出或者显示的字符集。也就是说如果客户端字符集和 NLS_LANG 中的 charset 不同,则会乱码。

2、查看 Oracle Server 字符集

查看 Oracle Server 字符集最罕用的办法有两种

▶查问 nls_database_parameters

select * from nls_database_parameters;

▶应用 userenv 函数

userenv 函数返回以后会话(session)的相干信息。以下 sql 语句能够查问以后会话连贯的数据库字符集

select userenv('language') from dual;

无关 userenv('parameter') 返回值的官网介绍如下

意思就是:返回的是以后会话应用的 language 和 territory。characterset 是数据库的字符集。

userenv 函数的具体应用和以后会话字符集的取值详见以下链接

oracle 的 userenv 和 nls_lang 详解

3、批改 Oracle Server 字符集

一旦数据库创立后,数据库的字符集实践上讲是不能扭转的。因而,在设计和装置之初思考应用哪一种字符集非常重要。依据 Oracle 的官网阐明,字符集的转换是从子集到超集受反对, 反之不行。如果两种字符集之间基本没有子集和超集的关系,那么字符集的转换是不受 oracle 反对的。对数据库 server 而言,谬误的批改字符集将会导致很多不可测的结果,可能会重大影响数据库的失常运行,所以在批改之前肯定要确认两种字符集是否存在子集和超集的关系。一般来说,除非万不得已,咱们不倡议批改 oracle 数据库 server 端的字符集。

以下是批改 server 端字符集的办法——不倡议应用

SQL> 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; 
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; 
SQL> select * from v$nls_parameters; 
重启查看是否更改实现:SQL> shutdown immediate;  
SQL> startup 
SQL> select * from v$nls_parameters; 

具体应用办法参见:oracle 服务器和客户端字符集的查看和批改

4、查看 Oracle Client 字符集

windows 查看 nls_lang

set NLS_LANG

linux 查看 nls_lang

echo $NLS_LANG

5、批改 Oracle Client 字符集

批改客户端字符集只须要批改上述查看后果中的 NLS_LANG 即可。

6、整顿补充

▶数据库字符集

select * from nls_database_parameters ;
select userenv('language') from dual;
  • 以上两种办法获得的都是数据库字符集,来源于 props$,是示意数据库的字符集。

▶实例字符集

select * from nls_instance_parameters; 
  • 次要波及 NLS_LANGUAGE、NLS_TERRITORY 的值. NLS_INSTANCE_PARAMETERS 其来源于 v$parameter

▶会话字符集

select * from nls_session_parameters; 
  • 来源于 v$nls_parameters,示意会话本人的设置,可能是会话的环境变量或者是 alter session 实现,如果会话没有非凡的设置,将与 nls_instance_parameters 统一。

详见 oracle 官网:NLS Database Parameters



记得帮我点赞哦!

精心整顿了计算机各个方向的从入门、进阶、实战的视频课程和电子书,依照目录正当分类,总能找到你须要的学习材料,还在等什么?快去关注下载吧!!!

朝思暮想,必有回响,小伙伴们帮我点个赞吧,非常感谢。

我是职场亮哥,YY 高级软件工程师、四年工作教训,回绝咸鱼争当龙头的斜杠程序员。

听我说,提高多,程序人生一把梭

如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个激励,将不胜感激。

职场亮哥文章列表:更多文章

自己所有文章、答复都与版权保护平台有单干,著作权归职场亮哥所有,未经受权,转载必究!

退出移动版