본문 바로가기
Oracle/아키텍쳐

Character Set

by 취미툰 2020. 4. 20.
반응형

DB의 캐릭터셋(Character Set)이란 중요한 요소입니다.

DB에 데이터를 저장할때 어떤 형식으로 저장할것인지 결정하는 요소이기 때문이고, 여러가지 종류가 있지만 종류에 따라서 글자수 당 byte가 다른 경우도 있으므로 데이터의 성격에 따라 신중하게 설정해야 한다고 개인적으로 생각합니다.

 

1.한글을 지원하는 캐릭터셋의 종류와 간단한 설명

아래는 대표적인 캐릭터셋의 종류와 간단한 설명입니다.

 

KO16MSWIN949 (CP949)

마이크로 소프트에서 만든 케릭터셋으로 한글을 표현할 수 있는 대표적인 캐릭터셋입니다. 이 캐릭터셋은 기본적으로 있던 KSC5601의 조합에 추가로 모든 한글을 표현할 수 있다고 합니다. KSC5601에서 지원하는 글자는 가나다순이지만, 그 외 글자는 뒤죽박죽으로 정의되어 있습니다. 뒤죽박죽된 글자에서 정렬이 문제가 될 수 있습니다.

(K016KSC5601의 상위 캐릭터셋입니다.)

 

AL32UTF8

Oracle 9i부터 지원되는 캐릭터셋입니다. 유니코드를 구현한 케릭터셋으로 한글을 포함한 모든 언어의 표기가 가능한 캐릭터셋입니다. 유니코드를 구현한 캐릭터셋중에 가변길이 인코딩 방식을 택하고 있는 캐릭터셋입니다. 가변길이를 위해 일종의 플래그 비트를 각 바이트마다 포함시키다보니 한글자를 표현하는데 필요한 바이트의 길이가 최대6바이트(UTF8은 3바이트)까지 늘어날 수 있습니다. ASCII는 1byte,그 외 유럽쪽은 2byte, 아시아는 3byte입니다.

UTF8과 AL32UTF8의 차이는 Supplement Character(UTF8에서 4바이트 이상을 차지하는)를 사용하는 것이 아니라 일반적인 다국어라면 차이가 없다고 할 수 있습니다.

 

AL32UTF16 (논외)

유니코드를 구현한 캐릭터셋으로 national characterset에서만 선택이 가능합니다. 모든 글자를 2bytes or 4bytes로 표현합니다.

 

National Characterset은 유니코드를 지원하지 않는 캐릭터셋을 가진 데이터베이스에서 유니코드를 지원하기 위해 부가적으로 설정할 수 있는 캐릭터셋입니다.

즉, 처음 시스템 구축 당시와는 달리 한글 이외의 다른 언어를 급히 저장해야 할 필요성이 있는 경우 National Characterset을 적절히 활용할 수 있습니다.

사용법은 특정타입(nchar,nvarchar2,nclob)으로 생성하여야 합니다.

 

2.NLS_LANG

클라이언트쪽에 설정하는 환경변수입니다. 

일반적으로는 DB서버와 클라이언트간의 NLS_LANG을 동일하게 하여 사용합니다. 이렇게 사용하는 이유는 Client 프로그램을 이용하여 직접 DB에 붙어서 작업하는 경우가 대부분이기 때문입니다.

 

[oracle@ysbae ~]$ echo $NLS_LANG
AMERICAN_AMERICA.KO16MSWIN949

 

저의 현재 설정된 NLS_LANG입니다.

NLS_LANG =[언어]_[영역].[캐릭터셋]으로 구성되어 있습니다.

 

언어: 현재 사용자가 사용하는 언어적 특성을 결정짓는 값

영역: 현재 사용자가 위치한 영역의 특성을 결정짓는 값

캐릭터셋: 현재 사용자의 시스템이 인식할 수 있는 캐릭터셋의 값

 

서버와 클라이언트간 동일한 NLS_LANG변수값을 굳이 사용할 필요는 없습니다. 하지만 자주 Client에서 작업을 수행한다면 같은 NLS_LANG값을 설정해야 데이터가 깨지지않고 작업할 수 있을것 같습니다.

추가적으로 아래의 경우 NLS_LANG값을 동일하게 하는 것을 권장하고 있습니다.

- DB로부터 데이터를 export받을 때

- export받은 DB와 같은 캐릭터셋을 가진 DB로 import할 때

- 기타 다국어 지원 애플리케이션에서 목적에 따라 사용할 때

 

 NLS_LANG 관련 주요 파라미터

 

SYS@newysbae> select * from nls_database_paraemters

PARAMETER                                                    VALUE
------------------------------------------------------------ ---------------------------------------------------------------------
NLS_LANGUAGE                                                 AMERICAN
NLS_TERRITORY                                                AMERICA
NLS_CURRENCY                                                 $
NLS_ISO_CURRENCY                                             AMERICA
NLS_NUMERIC_CHARACTERS                                       .,
NLS_CHARACTERSET                                             UTF8
NLS_CALENDAR                                                 GREGORIAN
NLS_DATE_FORMAT                                              DD-MON-RR
NLS_DATE_LANGUAGE                                            AMERICAN
NLS_SORT                                                     BINARY
NLS_TIME_FORMAT                                              HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT                                         DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT                                           HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT                                      DD-MON-RR HH.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

 

select * from nls_database_parameters 테이블이나 show parameter nls를 통해 확인 가능합니다.

 

NLS_LANGUAGE : 언어설정. NLS_LANG변수 값에 의해 자동으로 설정되는 초기화 파라미터

alter session set NLS_LANGUAGE='KOREAN' 으로 설정가능

NLS_TERRITORY : 영역설정.NLS_LANG변수 값에 의해 자동으로 설정되는 초기화 파라미터

alter session set NLS_TERRITORY='KOREA'으로 설정가능

NLS_COMP : SQL에서의 비교방식(<,>,= 등)의 설정 - BINARY,ANSI,LINGUISTIC이 있음

alter session set NLS_COMP='ANSI' 으로 설정가능

NLS_SORT : 문자열 정렬방식 설정, NLS_LANGUAGE값에 따라 결정

alter session set NLS_SORT='KOREAN_M'으로 설정가능

 

 

 

 

3.캐릭터셋 변경법

두가지 방법으로 테스트를 했습니다. 첫번째는 update로 하는방법이고 두번째는 alter database character set 명령어를 사용하는 방법입니다. 두방법 다 재기동이 필요합니다.

 

 

아래 1번방법은 권장하지 않습니다!!!! 이유는 아래와 같습니다. 

캐릭터셋 변경 방법 중 sys.props$를 직접 변경하는 방법은 추천하지 않습니다.
----
아직도 NLS_CHARACTERSET 또는 NLS_NCHAR_CHARACTERSET를 변경하기 위해 props$ 를 직접 갱신하는 DBA들이 있다. 이 방법은 지원되지 않을 뿐더러 데이터베이스 커럽(corrupt)을 유발할 수 있다. 이것은 전체 데이터셋을 망가뜨리는 최고의 방법 중 하나다.

만약에라도 그와 같은 방법을 시행했다면 가장 먼저 해야 할 일은 해당 데이터베이스를 전체 리스토어하는 일이다. 만약 백업이 없을 경우, 이 방식으로 망가진 데이터베이스의 데이터를 복구하는 경우에 대해 오라클 Support는 도움을 주기는 하겠지만, 데이터 복구에 대한 보장은 할 수 없다. 이 경우 데이터에 대해 full export를 받고 데이터베이스를 새로 생성해야 한다.
주의! props$를 직접 변경하지 말라.
----
출처 :
https://support.oracle.com/knowledge/Oracle%20Database%20Products/1573247_1.html

 

방법1

Update 시 sys.props$테이블의 값을 변경하면 됩니다. 일반 캐릭터셋뿐만아니라 NLS_CHARACTER 등 nls_database_parameters에 있는 값들은 다 있다고 볼 수 있으니 where 절에 원하는 변수를 삽입하여 변경 하면 됩니다.

update sys.props$ set value$='KO16MSWIN949' where name='NLS_CHARACTERSET'

 

commit;

 

후 재기동

 

방법2

alter database character set 명령어 사용법입니다.

 

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

 

SQL> startup mount

ORACLE instance started.

 

Total System Global Area 1653518336 bytes

Fixed Size                  2213896 bytes

Variable Size            1207961592 bytes

Database Buffers          436207616 bytes

Redo Buffers                7135232 bytes

Database mounted.

 

SQL> alter system enable restricted session;

 

System altered.

 

Elapsed: 00:00:02.03

SQL> alter database open;

 

Database altered.

 

SQL> alter database character set internal_use KO16KSC5601;

 

Database altered.

 

변경 후 재기동해줍니다.

 

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

 

SQL> startup

ORACLE instance started.

 

Total System Global Area 1653518336 bytes

Fixed Size                  2213896 bytes

Variable Size            1207961592 bytes

Database Buffers          436207616 bytes

Redo Buffers                7135232 bytes

Database mounted.

Database opened.

 

 

 

 

출처 : http://alicepure.blogspot.com/2013/08/oracle-utf-8.html 블로그

 

 

 

 

반응형

'Oracle > 아키텍쳐' 카테고리의 다른 글

오라클 기동,정지 절차  (0) 2020.06.12
Character Set 한글 테스트  (0) 2020.04.20
오라클 19c 아키텍쳐 소개  (0) 2020.03.05
인덱스 스플릿(INDEX SPLIT)  (0) 2019.12.30
[인덱스] 인덱스 생성 아키텍처  (0) 2019.11.06

댓글