카테고리 없음

Character Set

pbj1102 2022. 1. 26. 10:16
반응형

캐릭터셋(Character Set)

#영역(Territory)별 지원

- 나라마다 날짜 표기 방법이 다름.
- 영국 "일/월/연도"
  미국 "월/일/연도"

- 숫자 그룹 : 소수점 기호나 숫자를 그룹핑하는 방법이 지역마다 다름.
      반올림 방식, 음수기호의 위치 등...
      한국 : 소수점 기호 -> dot, 그룹기호 comma
      체코 : 소수점 기호 -> comma , 그룹기호 dot



#언어(Language)적 지원
- 캐릭터셋 : 각 언어가 저장될 수 있는 캐릭터셋을 대부분 지원한다. 
한국어 
- KO16MSWIN949
- KO16KSC5601



- 캐리터셋을 한국어로 선택하지 않는다고 해서 데이터베이스에 한국어를 저장 할 수 없다는 것은 아님
-> iSQL* plus 나, 자바, ADF 기반의 웹 app 경우 "언어 선택" 에 관계 없이
번역 작업 환경이 제공됨.
-> SQL *Plus 같은 기존 애플리케이션은 오라클의 번역 메시지 리소스에 의존하여
각 언어별로 따로 제공.

- 폰트 의 경우 반드시 다른 언어도 지원할 수 있도록 선택해야 함.

- 로케일 정보 (ex: x통화 코드($))  한국어 관한 로케일 정보를 위해 반드시 "한국어" 선택 필요



_ 올바른 캐릭터셋 -> 한글을 저장할 수 있는 캐릭터 셋을 말함


- 한글을 지원하는 캐릭터셋
1) KO16KSC5601
2) KO16MSWIN949
3) UTF8
4) AL32UTF8





1) KO16KSC5601
- 2350 자의 한글 -> 25*94 매트릭스 배열한 문자셋.  => 완성형 
* 완성형 이란
ex) 미안하오(o), 먄하오(x)
출력 : ?하오

- 4888자의 한자, 히라카나, 카타카나, 영문 및 기호 

- 한글 2바이트
- 오라클 지원 버전 : 7.x
- National Characterset 으로 설정 불가능

단점 : 한글 2350 자만 지원




2) KO16MSWIN949
- window 949 (마이크로사의 Window Codepage 949번 : 한글 코드 페이지)
-  KO16KSC5601 포함하고 있음.
+(추가로) 한글 조합으로 표현할 수 있는 8822자

* 운영체제가 KO16MSWIN949 지원하지 않는다고 데이터베이스 캐릭터셋을 KO16MSWIN949 지원하지 않는건 아님
운영체제가 지원하는 캐릭터셋과 데이터베이스가 지원하는 캐릭터셋은 다름

대신. os 자체에서 KO16MSWIN949 의 데이터를 출력할 때는 표현은 안됨 (추측)

- National Characterset 으로 불가능
- 한글 2바이트
- 오라클 지원 버전 : 8.0.6



단점 : 완성형(KO16KSC5601)과 호환을 하려고 하다보니 배열순서, 정렬 순서가 다름.
"Order by" 한글 정렬 x
=> KOREAN_M, UNICODE_BINARY 옵션 필요

3. UTF8/AL32UTF8
- 가변길이 인코딩 방식을 택하고 있는 캐릭터셋
- 가변길이를 위해 일종의 플래그 비트를 각 바이트의 길이가 최대 3바이트(AL32UTF8의 경우 6바이트)까지 늘어날수 있다.

- 한글 11172자( 가나다 순으로 정렬) 포함
- 한글 3바이트(AL32UTF8 동일)
- National Characterset 으로 설정 가능 (AL16UTF16 가능,  AL32UTF8 는 불가능)
- 오라클 지원 버전 : 8.0 , 9i Release 1(AL32UTF8 )
- 한글 한자를 3바이트로 차지하므로 공간 소모가 큼. ( 유니코드 인코딩/디코딩에 성능을 소모 )


  * DB설치시 N_캐릭터셋을 설치하지 않았다고 해서 NCHAR, NVARCHAR2, NCLOB 등... 을 사용 못하는 건 아님
- Nvarchar_value 컬럼에는 유니코드에 속한 모든 글자를 저장 할수 있다.
  단, 부가적인 코드가 필요.


 ex) 
1) 대부분 한글, 일부의 외국어 필요
=> KO16MSWIN949 , N_Characterset 외국어

2) 한국어 뿐만 아니라 중국어, 일본어, 러시아어 등 다양한 언어 필요시.
=> UTF8, AL32UTF8




- NLS 환경변수값 설정.

1) NLS_LANG 변수 구성
(1) 언어 
사용자가 사용하는 언어적 특성을 결정 짓는 값.


SYS@ORCL AS SYSDBA> select * from v$nls_parameters where parameter like '%LANG%';

PARAMETER            VALUE
-------------------- -------------------------
NLS_LANGUAGE         AMERICAN
NLS_DATE_LANGUAGE    AMERICAN


(2) 영역 
사용자가 위치한 영역의 특성을 결정 짓는 값


SYS@ORCL AS SYSDBA> select * from v$nls_parameters where parameter like '%TERR%';

PARAMETER            VALUE
-------------------- -------------------------
NLS_TERRITORY        AMERICA



(3) 캐릭터셋
사용자의 시스템 인식 할 수 있는 값.

SYS@ORCL AS SYSDBA> select * from v$nls_parameters where parameter like '%CHARACTERSET%';

PARAMETER                 VALUE
------------------------- -------------------------
NLS_CHARACTERSET          KO16MSWIN949
NLS_NCHAR_CHARACTERSET    AL16UTF16









* DB가 UTF8 일 경우, NLS_LANG UTF8 로 설정해야 하나?

=> 사용자 자신이 속해 있는 환경을 데이터베이스에게 알려주는 역활일 뿐

TEST




[oracle@DBTEST ~]$ export NLS_LANG=AMERICAN_AMERICA.KO16MSWIN949

=> 사용자는 영어(아메리카 영역), 컴퓨터의 캐릭터셋은 KO16MSWIN949 라는 의미



SCOTT@ORCL > select hiredate from emp where rownum < 4 ;

HIREDATE
------------
17-DEC-80
20-FEB-81
22-FEB-81


미국식으로 표현됨을 확인.





[oracle@DBTEST ~]$ export NLS_LANG=KOREAN_KOREA.KO16MSWIN949

=> 사용자는 한국(한국 영역), 컴퓨터의 캐릭터셋 KO16MSWIN949 라는 의미

SCOTT@ORCL > select hiredate from emp where rownum < 4 ;

HIREDATE
--------
80/12/17
81/02/20
81/02/22





* DB의 캐릭터 셋과 동일한 값으로 캐릭터셋을 설정하는 경우.
ex) DB = UTF8, (OS)NLS_LANG=KO16KMSWIN949 경우
- 데이터 출력시
UTF8로 인코딩된 문자열을 Window 949 코드 페이지로 변환하여 보여줌.

* 값을 동일하게 맞추는 경우
1) export
2) 같은 캐릭터셋을 가진 db로 export 파일을 import





* 데이터베이스에서 한글 비교
- 오라클의 기본 방식은 binary
=> 같은 글자라 해도 캐릭터셋 마다 이진코드가 다름.


- NLS_COMP
오라클이 비교 연산들을 수행 할 시 어떤 방식을 사용할지를 지정
- binary ,  ANSI


insert into test values('가');
insert into test values('갸');
insert into test values('나');
insert into test values('냐');
insert into test values('다');
insert into test values('댜');
insert into test values('라');
insert into test values('랴');
insert into test values('래');
insert into test values('마');
insert into test values('며');
insert into test values('뮤');
insert into test values('똠');



SCOTT@ORCL > select * from test where name >='다' AND name <'라';

NAME
--------------------





SCOTT@ORCL > ALTER SESSION SET NLS_COMP=ANSI;
SCOTT@ORCL > select * from test where name >='다' AND name <'라';

NAME
--------------------






캐릭터 변경. 
1) 캐릭터셋 딕셔너리 정보 변경 + 데이터 불변
- 딕셔너리에 있는 캐릭터셋 정보만 변경하는 작업.
(1) 설치 할때 캐릭터셋 잘못 선택 시
(2) 캐릭터 셋과는 엉뚱한 캐릭터셋으로 인코딩된 정보를 강제로 저장해온 인스턴스
=> ex) 기존 : US7ASCII         실제 : 완성형 + 윈도우즈 코드 페이지 949 
=> 딕셔너리 캐릭터셋을 KO16MSWIN949 변경


2) 캐릭터셋 딕셔너리 정보 변경 + 테이터 변경
- 데이터의 인코딩 까지도 변경하는 마이그레이션. 
* 백업 필수, imp/exp 해결






유의점 
1) 데이터 절삭
K016MSWIN949, KO16KSC5601 경우 한글 2바이트
UTF8 (AL16UTF8, AL32UTF8) 경우 한글 3바이트 
=> 컬럼의 단위 변경 필수





2) 데이터 깨짐
- US7ASCII 데이터베이스 의 한글 데이터를 
  imp/exp 이용하여 => KO16MSWIN949, UTF8 변경 시
=> 안된다. 시간낭비.

- KO16KSC5601 데이터베이스 의 한글 데이터를
imp/exp 이용하여 -> KO16MSWIN949  or UTF8 변경 시
=> 데이터가 일부 깨질 경우가 있음.

이럴 경우. 데이터베이스 딕셔너리 변경 후 imp/exp
* 데이터에 대한 어떠한 수정 없이 딕셔너리 값만 변경

ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET KO16MSWIN949;


oracle_nls_1.html
0.11MB
oracle_nls_2.html
0.10MB

기존 변경 여부
US7ASCII  KO16KSC5601
KO16MSWIN949
UTF8/AL32UTF8
가능
KO16KSC5601 KO16MSWIN949 가능
KO16MSWIN949 UTF8 불가능
UTF8 AL32UTF8 가능
반응형