작성일자 : 2024-09-12
Ver 0.1.1
0. 배경
프로젝트를 하던 중 장문의 텍스트가 들어갈 수 있는 필드를 Interface 해야할 상황이 생겼었다.
그 과정에서 자연스럽게 저장 용량과 관련된 내용이 언급이 되면서 한글의 용량에 대해서 알고 있어야 할 필요가 있음을 느꼈다.
진법에 대한 내용과 대표적인 한글 인코딩 방식인 UTF-8과 EUC-KR에 대한 내용은 아래 포스팅을 참고하길 바란다.
1. 한글을 표현하는 문자열 세트 (Character Set) 종류 및 설명
이름 | 내용 |
UTF-8 | - 유니코드를 이용하는 방법 - 모든 한글 표현 가능 - 3Byte를 이용하여 표현 - DB에서 한글 정렬이 가능 |
EUC-KR | - 총 2,350개 한글 표현 가능 - 2Byte를 이용하여 표현 |
CP949 | - EUC-KR을 확장하여 모든 한글 표현 가능 - 2Byte를 이용하여 표현 |
1-1. UTF-8
- 유니코드로 표현하는 방법으로 모든 한글 표현이 가능하다.
- U+AC00 ~ U+D7A3 범위를 가짐
- 초성(19) x 중성(21) x 종성 (27 +1) = 총 11,172개의 한글 표현 가능
- 가변 크기로 1 ~ 4 Byte 크기르 가지며, 한글의 경우 3Byte로 표현한다.
- 실제 2Byte(16bit)로 모든 한글 표현이 가능하지만 유니코드 설계상 3Byte로 인코딩
- DB에서 한글 정렬이 가능하다.
1-2. EUC-KR
- KS 완성형 + 아스키 코드가 합쳐진 형태
- 아스키 코드 (영어 포함)는 1Byte(00 ~ 7F)로 표현
- 한글은 2Byte로 표현하며 각 Byte가 A1 ~ FE 영역을 가짐
- 자주 사용하는 한글 2,350개만 코드로 할당하였으므로 한글은 2,350개만 표현 가능
1-3. CP949
- 모든 한글을 표현하기 위해 EUC-KR을 확장한 형태로 EUC-KR과 호환이 가능하다.
- EUC-KR -> CP949 변환시 모든 한글에 대해 깨짐없이 변환 가능
- CP949 -> EUC-KR의 경우 EUC-KR 코드표에 없는 문자(예: '똠')는 문자 깨짐 발생
2. Oracle에서의 Charater Set
Oracle의 Charter Set을 확인하는 쿼리는 아래와 같다.
SELECT *
FROM nls_database_parameters
WHERE PARAMETER LIKE '%CHARACTERSET%'
위 결과에 따르면 'AL32UTF8'은 오라클에서 사용하는 Character Set이고 앞서 언급한대로 유니코드를 지원한다.
'AL16UTF16'은 NLS_CHARACTERSET으로 사용할 수 없는 NLS_NCHAR_CHARACTERSET으로만 사용 가능한 Character Set이다.
또한 바이트를 출력해주는 함수인 'VSIZE'도 있으니 용량 확을 해야할 필요가 있다면 사용하면 된다.
SELECT VSIZE('오라클')
FROM DUAL;