찾다
데이터 베이스MySQL 튜토리얼【不错】浅析Oracle三层全球化支持(NLS)

作为一个成熟的商业 数据库 软件 , Oracle 对全球化( Global Support )有着全面的支持和解决方案。 Oracle 在国际化支持方面主要体现在几个方面: ü 全球化字符集支持;目前, Oracle 支持所有主流的字符集样式。通过 NLS_CHARACTER 和 NLS_NCHAR_CHARACT

作为一个成熟的商业数据库软件Oracle对全球化(Global Support)有着全面的支持和解决方案。Oracle在国际化支持方面主要体现在几个方面:

ü 全球化字符集支持;目前,Oracle支持所有主流的字符集样式。通过NLS_CHARACTERNLS_NCHAR_CHARACTER指定的字符集可以支持全世界绝大多数语言文字的存储。Oracle推荐的字符集样式为AL32UTF8,也就是通常我们所见的UTF-8编码格式;

ü 全球化时区Timezone支持;全球化一个重要问题就是时区显示和保存问题。不同时区的用户同时向一个数据库插入数据,其时间先后是不可能回避的问题。同时,当非本地时区日期类型显示的时候,时区如何进行转换。Oracle在这个问题上提供了两个类型:Timestamp with timezoneTimestamp with local timezone,方便的解决了这些问题;

ü 日期和数字格式显示问题;日期和数字类型的显示,带有很强烈的地区特性。比如,欧美格式“17-SEP-12”和我们更接受的“2012-9-17”就有很大的差距。Oracle将数据取值和显示分割开来,让session级别用户可以控制最终的显示;

ü 软件显示语言;在Oracle软件和一些显示中,很多的字符和软件输出就带有语言特性。比如,我们在英文版的Oracle服务端调用时间函数,获得“17-SEP-12”,而在笔者的客户端系统中,就显示为“17-9-12”。这都是Oracle NLS国际化所起到的作用;

 

NLS是一套覆盖面广、内容庞杂的知识体系。笔者计划在接下来用一个系列来分析这个体系。本次,我们只是给NLS一个简单的体系介绍:Oracle的三层NLS体系关系和优先级配置。

 

1、环境介绍

 

笔者选择Oracle 11gR2进行试验。

 

SQL> select * from v$version;

BANNER

---------------------------------------

Oracle Database 11g EnterpriseEdition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE   11.2.0.1.0 Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 – Production

 

服务器Red Hat 5.3 32bit安装时选择的是英文,美语。

 

[oracle@bspdev ~]$ uname -a

Linux bspdev.localdomain 2.6.18-308.el5 #1 SMP Tue Feb 21 20:05:41EST 2012 i686 i686 i386 GNU/Linux

 

 

查看Linux系统支持语言和时区:

 

[oracle@bspdev ~]$ cat /etc/sysconfig/i18n

LANG="en_US.UTF-8"

SYSFONT="latarcyrheb-sun16"

 

[oracle@bspdev sysconfig]$ pwd

/etc/sysconfig

[oracle@bspdev sysconfig]$ cat clock

# The ZONE parameter isonly evaluated by system-config-date.

# The timezone of the system is defined by the contents of/etc/localtime.

ZONE="Asia/Shanghai"

UTC=true

ARC=false

 

客户端使用的是中文的Windows 7,对应的Oracle注册表内容为:

 【不错】浅析Oracle三层全球化支持(NLS)

NLS_LANG参数告知本地所在地中国、中文语言和ZHS16GBK字符集。

 

2、三层NLS体系

 

OracleGlobal Support复杂的原因之一,就是Oracle的三层NLS体系。任何一个会话session在连接入数据库之后,都会面对三层NLS参数体系,分别为:DatabaseInstanceSession

 

ü Database Level NLS Parameter:数据库层面的NLS参数是在数据库创建的时候确定的一系列的参数。在创建数据库的时候,我们都可以通过OUI或者responseFile进行配置。大部分Database Level NLS Parameter都是不可以改变,或者不能轻易改变的,如CharacterSet

ü Instance Level NLS Parameter:在数据库运行过程中,一些NLS参数是通过Spfile/Pfile参数文件进行配置,并且可以对Database Level NLS进行一定的覆盖修改。如果Instance LevelDatabase Level的发生冲突,以Instance Level覆盖Database Level的配置;

ü Session Level NLS Parameter:这个层面是和用户连接效果最直接的层面。用户使用的NLS参数很多都是取到这个层面的参数。Session Level Parameter来自客户端配置内容,主要是通过一系列的环境变量来确定。Session LevelParameter是可以覆盖Instance Level的参数的;

 

下面我们分别来介绍几个层面参数中的重要内容。

 

3Database Level NLS Parameter

 

Database level参数是三层体系中最底层,这个层面的参数取值和Oracle数据库创建时的配置选项密切相关。我们在联入数据库时,可以通过几个视图来查看这个“根本性”的参数内容。

 

SQL> select * from nls_database_parameters;

 

PARAMETER                     VALUE

---------------------------------------------------------------------

NLS_LANGUAGE                  AMERICAN

NLS_TERRITORY                 AMERICA

NLS_CURRENCY                  $

NLS_ISO_CURRENCY              AMERICA

NLS_NUMERIC_CHARACTERS        .,

NLS_CHARACTERSET              AL32UTF8

NLS_CALENDAR                  GREGORIAN

NLS_DATE_FORMAT               DD-MON-RR

NLS_DATE_LANGUAGE             AMERICAN

NLS_SORT                      BINARY

NLS_TIME_FORMAT               HH.MI.SSXFFAM

NLS_TIMESTAMP_FORMAT          DD-MON-RRHH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT            HH.MI.SSXFFAM TZR

NLS_TIMESTAMP_TZ_FORMAT       DD-MON-RRHH.MI.SSXFF AM TZR

NLS_DUAL_CURRENCY             $

NLS_COMP                      BINARY

NLS_LENGTH_SEMANTICS          BYTE

NLS_NCHAR_CONV_EXCP           FALSE

NLS_NCHAR_CHARACTERSET        AL16UTF16

NLS_RDBMS_VERSION             11.2.0.1.0

 

20 rows selected

 

nls_xxx_parameters系列视图非常重要,特别是在我们配置NLS参数的过程中。我们可以通过nls_database_parameters查看到DatabaseNLS参数。

 

NLS_CHARACTERSETNLS_NCHAR_CHARACTERSET用于表示Oracle在保存varchar2/charnvarchar2/nchar字段时的保存类型。从Oracle官方推荐的角度,我们设置AL32UTF8字符集作为数据库字符集,基本上就可以应对常见的字符文字类型了。

 

在安装程序OUI运行是,AL32UTF8往往不是默认选项。Oracle OUI程序会根据所在服务器操作系统的配置内容,为我们选择出一个字符集。

 

在从操作系统选择出字符集合的过程中,NLS_LANGLANG)环境变量起到很重要的作用。NLS_LANG是我们安装Oracle过程中,确定NLS参数的一个重要环境变量。

 

根据Oracle的要求,NLS_LANG中包括了Oracle所在地域Territory、语言Language和字符集CharacterSet三部分内容。

 

NLS_LANG=_.

 

 

如果我们需要在配置Oracle前就确定这些参数内容,可以预先定义环境变量NLS_LANGUnix/Linux环境下,可以配置在Oracle用户的.bash_profile中。而Windows环境下,这个参数要配置在注册表中。

 

此外,NLS_DATA_LANGUAGE用来表示Oracle在显示日期类型的文字内容时,使用什么语言。

 

Database Level NLS parameter是非常基本的,起作用的范围主要数据库内部。另一方面,Database Level NLS Parameter是作为Instance Level配置的默认基础值。在安装数据库后,我们基本不能、也不会对database levelNLS参数进行修改。我们的“手脚”只能在InstanceSession level进行。

 

3Instance level NLS Parameter

 

Instance Level NLS parameter,就是我们可以控制的领域了。Instance参数主要来自于参数文件SPFILE/PFILE。我们可以通过nls_instance_parameters来查看这个层面的参数配置。

 

SQL> select * from nls_instance_parameters;

 

PARAMETER                     VALUE

------------------------------ -------------------------

NLS_LANGUAGE                  AMERICAN

NLS_TERRITORY                 AMERICA

NLS_SORT                      

NLS_DATE_LANGUAGE             

NLS_DATE_FORMAT               

NLS_CURRENCY                  

NLS_NUMERIC_CHARACTERS        

NLS_ISO_CURRENCY              

NLS_CALENDAR                  

NLS_TIME_FORMAT               

NLS_TIMESTAMP_FORMAT          

NLS_TIME_TZ_FORMAT            

NLS_TIMESTAMP_TZ_FORMAT       

NLS_DUAL_CURRENCY             

NLS_COMP                      BINARY

NLS_LENGTH_SEMANTICS          BYTE

NLS_NCHAR_CONV_EXCP           FALSE

 

17 rows selected

 

相对于database levelInstance level的参数数量是很少的。通常我们不会在参数文件层面进行NLS参数配置,保持Database Level的默认配置就可以了。

 

这样的原因是Instance Level配置是针对所有连接而言的。而国际化的目的就是在于不同连接用户,看到Local化的结果。无论Instance Level进行何种的配置,最终很有可能都是被Session level的所覆盖。

 

Database level之所以会有完备的NLS参数,很大层面上是提供了一个基础参数集合和存储标准。NLS的重头在session层面。

 

4Session Level NLS Parameter

 

Session LevelNLS参数是和用户最直接交互的部分。我们可以通过nls_session_parameters视图查看到这个内容。

 

SQL> select * from nls_session_parameters;

 

PARAMETER                     VALUE

------------------------------ -------------------------

NLS_LANGUAGE                  SIMPLIFIEDCHINESE

NLS_TERRITORY                 CHINA

NLS_CURRENCY                  

NLS_ISO_CURRENCY              CHINA

NLS_NUMERIC_CHARACTERS        .,

NLS_CALENDAR                  GREGORIAN

NLS_DATE_FORMAT               DD-MON-RR

NLS_DATE_LANGUAGE             SIMPLIFIEDCHINESE

NLS_SORT                      BINARY

NLS_TIME_FORMAT               HH.MI.SSXFFAM

NLS_TIMESTAMP_FORMAT          DD-MON-RRHH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT            HH.MI.SSXFFAM TZR

NLS_TIMESTAMP_TZ_FORMAT       DD-MON-RRHH.MI.SSXFF AM TZR

NLS_DUAL_CURRENCY             

NLS_COMP                      BINARY

NLS_LENGTH_SEMANTICS          BYTE

NLS_NCHAR_CONV_EXCP           FALSE

 

17 rows selected

 

session level的参数是影响最终我们看到NLS结果的控制因素。Session levelNLS参数来自客户端配置。对Windows而言,就是我们注册表中关于NLS_LANG等一系列的环境变量。对Unix/Linux而言,就是我们配置在.bash_profile文件中定义的相应内容。

 

注意,NLS_LANG本身包括的内容很多。NLS_LANG包括了客户端地域、语言和字符集信息。地域间接影响到时区,语言会影响到显示语言。而字符集更是影响数据从服务器传递过来客户端后,进行的转换策略。

 

在三层NLS体系下,Session LevelParameter起到最后的决定作用。如果Session level没有配置,Oracle会选择Instance乃至Database的配置。Session Level的配置会覆盖Instance level的取值。

 

我们可以根据自己的情况,动态的进行调节session level nls parameter。如果我们只是希望NLS暂时性修改,可以选择alter session set语句进行参数切换。

 

SQL> select sysdate from dual;

 

SYSDATE

--------------

17-9月 -12

 

SQL> alter session set nls_date_format='yyyy-mm-ddhh24:mi:ss';

会话已更改。

 

SQL> select sysdate from dual;

SYSDATE

-------------------

2012-09-17 06:23:58

 

如果希望长期的修改,可以考虑在环境变量的层面上修改参数。在windows上,可以添加注册表参数。

 【不错】浅析Oracle三层全球化支持(NLS)


 

 

SQL> select * from nls_session_parameters whereparameter='NLS_DATE_FORMAT';

 

PARAMETER                     VALUE

------------------------------ -------------------------

NLS_DATE_FORMAT               yyyy-mm-ddhh24:mi:ss

 

 

SQL> conn sys/oracle@wilson as sysdba

已连接。

SQL> select sysdate from dual;

 

SYSDATE

-------------------

2012-09-17 06:29:02

 

 

 

5、结论

NLS参数对我们开发和使用Oracle,至关重要!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
MySQL의 라이센스는 다른 데이터베이스 시스템과 어떻게 비교됩니까?MySQL의 라이센스는 다른 데이터베이스 시스템과 어떻게 비교됩니까?Apr 25, 2025 am 12:26 AM

MySQL은 GPL 라이센스를 사용합니다. 1) GPL 라이센스는 MySQL의 무료 사용, 수정 및 분포를 허용하지만 수정 된 분포는 GPL을 준수해야합니다. 2) 상업용 라이센스는 공개 수정을 피할 수 있으며 기밀이 필요한 상업용 응용 프로그램에 적합합니다.

MyISAM을 통해 언제 innodb를 선택 하시겠습니까?MyISAM을 통해 언제 innodb를 선택 하시겠습니까?Apr 25, 2025 am 12:22 AM

MyISAM 대신 InnoDB를 선택할 때의 상황에는 다음이 포함됩니다. 1) 거래 지원, 2) 높은 동시성 환경, 3) 높은 데이터 일관성; 반대로, MyISAM을 선택할 때의 상황에는 다음이 포함됩니다. 1) 주로 읽기 작업, 2) 거래 지원이 필요하지 않습니다. InnoDB는 전자 상거래 플랫폼과 같은 높은 데이터 일관성 및 트랜잭션 처리가 필요한 응용 프로그램에 적합하지만 MyISAM은 블로그 시스템과 같은 읽기 집약적 및 트랜잭션이없는 애플리케이션에 적합합니다.

MySQL에서 외국 키의 목적을 설명하십시오.MySQL에서 외국 키의 목적을 설명하십시오.Apr 25, 2025 am 12:17 AM

MySQL에서 외국 키의 기능은 테이블 간의 관계를 설정하고 데이터의 일관성과 무결성을 보장하는 것입니다. 외국 키는 참조 무결성 검사 및 계단식 작업을 통해 데이터의 효과를 유지합니다. 성능 최적화에주의를 기울이고 사용할 때 일반적인 오류를 피하십시오.

MySQL의 다른 유형의 인덱스는 무엇입니까?MySQL의 다른 유형의 인덱스는 무엇입니까?Apr 25, 2025 am 12:12 AM

MySQL에는 B-Tree Index, Hash Index, Full-Text Index 및 공간 인덱스의 네 가지 주요 인덱스 유형이 있습니다. 1.B- 트리 색인은 범위 쿼리, 정렬 및 그룹화에 적합하며 직원 테이블의 이름 열에서 생성에 적합합니다. 2. HASH 인덱스는 동등한 쿼리에 적합하며 메모리 저장 엔진의 HASH_Table 테이블의 ID 열에서 생성에 적합합니다. 3. 전체 텍스트 색인은 기사 테이블의 내용 열에서 생성에 적합한 텍스트 검색에 사용됩니다. 4. 공간 지수는 지리 공간 쿼리에 사용되며 위치 테이블의 Geom 열에서 생성에 적합합니다.

MySQL에서 인덱스를 어떻게 생성합니까?MySQL에서 인덱스를 어떻게 생성합니까?Apr 25, 2025 am 12:06 AM

toreateanindexinmysql, usethecreateindexstatement.1) forasinglecolumn, "createindexidx_lastnameonemployees (lastname);"2) foracompositeIndex를 사용하고 "createDexIdx_nameonemployees (forstName, FirstName);"3)을 사용하십시오

MySQL은 sqlite와 어떻게 다릅니 까?MySQL은 sqlite와 어떻게 다릅니 까?Apr 24, 2025 am 12:12 AM

MySQL과 Sqlite의 주요 차이점은 설계 개념 및 사용 시나리오입니다. 1. MySQL은 대규모 응용 프로그램 및 엔터프라이즈 수준의 솔루션에 적합하며 고성능 및 동시성을 지원합니다. 2. SQLITE는 모바일 애플리케이션 및 데스크탑 소프트웨어에 적합하며 가볍고 내부질이 쉽습니다.

MySQL의 색인이란 무엇이며 성능을 어떻게 향상 시키는가?MySQL의 색인이란 무엇이며 성능을 어떻게 향상 시키는가?Apr 24, 2025 am 12:09 AM

MySQL의 인덱스는 데이터 검색 속도를 높이는 데 사용되는 데이터베이스 테이블에서 하나 이상의 열의 주문 구조입니다. 1) 인덱스는 스캔 한 데이터의 양을 줄임으로써 쿼리 속도를 향상시킵니다. 2) B-Tree Index는 균형 잡힌 트리 구조를 사용하여 범위 쿼리 및 정렬에 적합합니다. 3) CreateIndex 문을 사용하여 CreateIndexIdx_customer_idonorders (customer_id)와 같은 인덱스를 작성하십시오. 4) Composite Indexes는 CreateIndexIdx_customer_orderOders (Customer_id, Order_Date)와 같은 다중 열 쿼리를 최적화 할 수 있습니다. 5) 설명을 사용하여 쿼리 계획을 분석하고 피하십시오

MySQL에서 트랜잭션을 사용하여 데이터 일관성을 보장하는 방법을 설명하십시오.MySQL에서 트랜잭션을 사용하여 데이터 일관성을 보장하는 방법을 설명하십시오.Apr 24, 2025 am 12:09 AM

MySQL에서 트랜잭션을 사용하면 데이터 일관성이 보장됩니다. 1) STARTTRANSACTION을 통해 트랜잭션을 시작한 다음 SQL 작업을 실행하고 커밋 또는 롤백으로 제출하십시오. 2) SavePoint를 사용하여 부분 롤백을 허용하는 저장 지점을 설정하십시오. 3) 성능 최적화 제안에는 트랜잭션 시간 단축, 대규모 쿼리 방지 및 격리 수준을 합리적으로 사용하는 것이 포함됩니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음