캐릭터셋(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 로 설정해야 하나?
X
=> 사용자 자신이 속해 있는 환경을 데이터베이스에게 알려주는 역활일 뿐
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;
기존 | 변경 | 여부 |
US7ASCII | KO16KSC5601 KO16MSWIN949 UTF8/AL32UTF8 |
가능 |
KO16KSC5601 | KO16MSWIN949 | 가능 |
KO16MSWIN949 | UTF8 | 불가능 |
UTF8 | AL32UTF8 | 가능 |