[Oracle] Character Set 에 관하여 (KO16KSC5601 / KO16MSWIN949)
by Roel Downey문자셋 확인
select * from nls_database_parameters;
select * from nls_database_parameters where parameter = 'NLS_CHARACTERSET'; // nls_database_parameters 테이블에서 캐릭터셋만 조회
한국어를 지원하는 characterset 으로 대표적인 것이 두가지 있다.
KO16KSC5601 과 KO16MSWIN949
이 두가지 character set 은 한글을 표현하는 EUC_KR의 character set 이다.
KO16KSC5601
한글 완성형 코드와 일치하며 일반적으로 많이 사용되는 2350자의 한글, 4888자의 한자와 히라카나, 카타카나, 그리고 영문 및 각종 기호들을 포함하고 있다.
KO16MSWIN949
Windows-949 Character Set은 MS사의 Windows Codepage 949번, 즉 한글 코드 페이지를 따른 코드셋이다. 이는 완성형(KO16KSC5601)을 그대로 포함하고 있으며, 추가로 현대 한글 조합으로 표현 할 수 있는 모든 가짓수에 해당하는 8822자의 한글을 추가해 포함하고 있다. 그러니까 "Windows-949 Character Set은 KSC5601의 SuperSet이 되며, 따라서 "KO16MSWIN949 또한 KO16KSC5601의 SuperSet이 된다.
즉, KO16MSWIN949가 KO16KSC5601를 포함하고 있다고 봐도 무방하며, 실제로 DB 마이그레이션 작업시
KO16KSC5601의 DB를 KO16MSWIN949 로 마이그레이션 할때는 크게 문제 되지 않는다.
반면, 반대로 작업 시에는 문제가 발생 할수 있다. 역시 표기 할수 있는 글자 수의 차이 때문이다.
또 유니코드의 character set 인 UTF-8과 AL32UTF8 도 한글을 지원 하는데 해당 character set 은 한글 뿐만 아니라 모든 언어의 표기가 가능 하다.
UTF8 / AL32UTF8
UTF8 은 유니코드를 구현한 Character Set 중에 가변결이 인코딩 방식을 택하고 있는 Character Set이다. 가변 길이를 위해 일종의 플래그 비트를 각 바이트마다 포함시켜야 하다보니, 한 글자를 표현하는데 필요한 바이트의 길이가 최대 3바이트(AL32UTF의 경우 6바이트)까지 늘어날 수 있다.
한글지원 Character Set 비교표
KO16KSC5601 | KO16MSWIN949 | UTF8 | AL32UTF8 | |
한글지원 상태 | 2350자 | 11172자 | 11172자 | 11172자 |
캐릭터셋/인코딩 | 한글완성형 | 한글조합형 | 8.1.6이전:Unicode 2.1 8.1.7이후:Unicode 3.0 |
9i R1 : Unicode 3.0 9i R2 : Unicode 3.1 10g R1 : Unicode 3.2 10g R2 : Unicode 4.0 |
한글바이트 | 2 Bytes | 2 Bytes | 3 Bytes | 3 Bytes |
지원버전 | 7.x 이상 | 8.0.6 이상 | 8.0이상 | 9i R1 이상 |
National Character Set | 불가능 | 불가능 | 가능 | 불가능 |
기타 |
National CharacterSet
National CharacterSet은 유니코드를 지원하지 않는 CharacterSet을 가진 데이터베이스에서 유니코드를 지원하기 위해 부가적으로 설정할 수 있는 CharacterSet이다.
즉, 하나의 데이터베이스 인스턴스는 "CharacterSet"과 "National CharacterSet"을 가진다. 처음 시스템 구축 당시와는 달리, 한글 이외의 다른 언어를 급히 저장해야 할 필요성이 있는 경우 National CharacterSet을 적절히 활용할 수 있다.
National CharacterSet이 가능한 CharacterSet은 단 두가지로, UTF8과 AL16UTF16(기본값)이다.
Nation CharacterSet을 사용하기 위해서는 특정 타입으로 테이블읠 컬럼 또는 PL/SQL 변수를 선언해야 한다. CHAR와 VARCHAR2, CLOB에 대응되는 National CharacterSet 기반의 타입으로는 NCHAR, NVARCHAR2, NCLOB이 있다.
즉, KO16MSWIN949 데이터베이스에서 다음과 같이 테이블을 생성할 경우,
create table test_table (
varchar_value VARCHAR2(2000),
nvarchar_value NVARCHAR2(2000)
);
"varchar_value" 컬럼에는 KO16MSWIN949에 속하는 글자들만 저장 할 수 있는 반면, nvarchar_value 칼럼에는 유니코드에 속한 모든 글자들을 저장할 수 있다. 약간의 부가적인 코드가 필요할 뿐 실제 프로그래밍 방식은 거의 동일하다.
CharacterSet 선택의 원칙
- 한글 지원을 위해서는 반드시 위의 네가지 CharacterSet 중에 하나를 선택해야 함
- 한국에서만 사용하는 시스템이라면 KO16MSWIN949를 선택한다.
- 한국어뿐 아니라 중국어, 일본어, 러시아어 등 다양한 언어로 된 데이터를 저장해야 한다면 UTF8, AL32UTF8을 선택한다.
인코딩 변환으로 한국어 기반의 CharacterSet에 비해 속도의 저하가 있다고 알려져 있음
- 대부분이 한글이며, 일부 외국어가 필요하다면, 한국어 기반의 CharacterSet(KO16MSWIN949)을 사용하되,
National CharacterSet을 이용한 칼럼에 외국어를 저장한다.
언어의 정렬
오라클 DB에서 한글을 사용하다보면 정렬에 관한 문제가 발생하는 경우가 있다. 특히 동양권(한국/일본) 언어에서는 자국에 원어이외에 한자를 사용하고 있으므로 인해 여러가지 문제가 발생하는 경우가 있다.
KO16KSC5601에서 한글 정렬
KO16KSC5601 에서는 한글 2350자의 바이너리 정렬 순서가 한글의 언어적 정렬 방식과 동일하다. 따라서, 단순히 Order by 명령만으로 정렬의 효과를 거둘 수 있다. 한자의 경우 한글 뒤에 한자의 음에 맞게 정렬이 된다.
이것은 단지 한글 2350자들과 한자 4888자의 정렬일뿐이며, 나머지 글자들에 대해서는 입출력도 불가능하다.
KO16MSWIN949에서 한글 정렬
KO16MSWIN949 는 KO16KSC5601에서 지원되지 않는 8822자의 한글을 추가적으로 지원한다는 점에서 KO16KSC5601의 대안으로 자주 이용되는 Character Set이다. 하지만, 총 11172자의 한글의 바이트 코드가 한글의 언어적 정렬 순서와 불일치 한다.
UTF8/AL32UTF8에서 한글 정렬
UTF8 데이터베이스의 경우, 한글만을 고려하면 별다른 정렬 옵션이 필요없다. 왜냐하면 한글 11172자의 정렬 순서와 바이트 코드 정렬 순서가 일치하기 때문이다.
그러나 한자를 포함한다면 한자->한글 식으로 정렬이 된다.
NLS_SORT
UTF8과 KO16MSWIN949에서는 원하는 형태의 정렬이 일어나지 않는다. 이럴 때 NLS_SORT 값을 활용하여 원하는 형태의 정렬을 구현할 수 있다.
NLS_SORT='KOREAN_M'
- 한글은 단순히 유니코드 바이트 정렬에 의존한다.
- 모든 한글은 한자에 우선한다.
- 한자는 발음 순서대로 정렬된다.
한마디로 KO16KSC5601에서 사용되던 정렬 방식으로 모든 한글과 한자를 정렬하겠다는 방법이다.
NLS_SORT='UNICODE_BINARY'
이 방법을 사용하면 각각의 문자에 대응하는 이진코드값을 기준으로 정렬된다. 이때는 한자->한글 순이다.
즉, 한글과 한자를 사용하는 경우에는 NLS_SORT='KOREAN_M'을 사용해야 한다.
'DB' 카테고리의 다른 글
[Oracle] SID 및 DB NAME 확인 (0) | 2022.07.18 |
---|---|
[Oracle] DB 계정 추가 , 권한 부여 (0) | 2022.07.18 |
2개 이상의 다중 컬럼으로 기본키(Primary Key) 지정하기 (0) | 2022.02.24 |
[ORACLE] 오라클 comment 추가/확인/수정/삭제 방법 (0) | 2022.02.24 |
[ORACLE] 오라클 테이블 컬럼 추가/수정/삭제/변경 하는 방법 (ALTER 활용) (0) | 2022.02.10 |
블로그의 정보
What doing?
Roel Downey