Oracle 가운뎃 점(·) INSERT 시 물음표(?)가 들어가는 경우
해당 포스팅에서는 오라클 데이터베이스에서 Character set 문제로 인해 일부 특수문자가 물음표(?)로 저장되는 경우에 대해 정리해 보았습니다.
제목에서는 '가운뎃 점(·)'이라고 표현했지만 실제 가운뎃 점인 Middle Dot에서는 해당 문제가 발생하지 않았으며, 가운뎃 점과 비슷한 모양의 'Hyphenation Point(‧)', 'Bullet(•)'에서 데이터베이서의 캐릭터 셋에 따라 값이 물음표로 저장되는 상황을 확인했습니다.
아래 내용에서는 오라클 데이터베이서의 Character Set인 'KO16KSC5601', 'KO16MSWIN949', 'UTF8/AL32UTF8'에서 특수문자 'Hangul Letter Araea(U+318D)', 'Middle Dot(U+00B7)', 'Hyphenation(U+2027)', 'Bullet(U+2022)'이 어떻게 저장되는지 비교해 보았습니다.
***
결론을 먼저 공유드리자면 'KO16KSC5601', 'KO16MSWIN949' 캐릭터셋에서 'Hyphenation(U+2027 / ‧)', 'Bullet(U+2022 / •)' 특수문자가 깨져서 물음표로 출력되는 것을 확인했습니다.
확인 대상 특수문자(가운뎃 점 외 비슷한 형태의 특수문자들)
Character Set에 대한 지원 여부를 확인해 볼 대상 특수문자들의 간단한 설명은 아래와 같습니다.
1. Hangul Letter Area(한글 문자 아래아 ㆍ)
한글 자모 또는 음절을 메모리 영역 또는 유니코드 범위에서 처리하기 위해 나온 개념입니다.
유니코드 'U+318D'로 표현되며, 1993년 Unicode 1.1 Version에 추가되었습니다.
2. Middle Dot(가운뎃 점, 중간 점 ·)
'가운뎃 점' 또는 '중간 점'이라고 불리는 Middle Dot은 두 개 이상의 단어 목록을 나타내는 데 쓰이는 등, 주로 구분 기호로 사용됩니다.
유니코드 'U+00B7'로 표현되며, 1993년 Unicode 1.1 Version에 추가되었습니다.
3. Hyphenation Point(하이픈화 지점 ‧)
주로 단어 분리에 사용되며, 유니코드 'U+2027'로 표현됩니다.
마찬가지로 Unicode 1.1 Version에 추가되었습니다.
4. Bullet(불릿 •)
주로 목록의 항목을 구분할 때 사용되는 기호로 중요한 항목을 강조할 때도 사용됩니다.
유니코드 'U+2022'로 표현되며, 1993년 Unicode 1.1 Version에 추가되었습니다.
비교 대상 Character Set
Oracle Database에서 한글을 지원하는 Character Set으로는 'KO16KSC5601', 'KO16MSWIN949', 'UTF8', 'AL32UTF8' 정도가 존재하는데요. 각각의 캐릭터셋에 대한 특징을 간단하게 살펴보면 아래와 같습니다.
1. KO16KSC5601
KO16KSC5601은 KSC5601 표준을 따르는 한국어 문자 집합으로, 1976년 한글을 표현하는 코드체계의 국가표준으로 처음 제시되었습니다.
(통상 완성형 코드라고 지칭합니다.)
2바이트로 구성된 문자 집합이며 2,350자의 완성형 한글과 94자의 조합형 자음 및 모음, 그리고 한자 4,888자 등을 지원합니다.
'똠, 펲, 샾, 잌, 볖, 볌, 뮌, 믜, 됌' 같이 KSC5601에 정의되지 않은 한글은 표현할 수 없다는 특징이 있습니다.
2. KO16MSWIN949
KO16MSWIN949는 Windows의 CP949 문자 집합을 기반으로 하는데요.
완성형 코드(KO16KSC5601)를 그대로 포함하고 있으면서 현대 한글 조합으로 표현할 수 있는 모든 가짓수에 해당하는 8822자의 한글을 포함하고 있다는 특징이 있습니다.
(때문에 KO16MSWIN949를 KO16KSC5601의 상위 집합, Superset이 됩니다.)
3. UTF8, AL32UTF8
UTF-8과 AL32UTF8은 Unicode 문자 집합을 기반으로 한 문자 집합입니다.
UTF-8은 가변 길이 인코딩 방식으로 각 문자를 1바이트에서 4바이트까지 사용할 수 있으며, 기본적으로 영어와 같은 ASCII 문자는 1바이트로 저장되고, 한글이나 중국어와 같은 문자들은 2~3바이트로 저장됩니다.
다국어를 지원하기 때문에 효율적이며, 보편적으로 가장 많이 사용된다는 특징이 있습니다.
(AL32UTF8은 Oracle에서 사용되는 UTF-8 기반의 문자 집합으로 UTF-8에 비해 성능 및 호환성 개선 등, 오라클에 특화된 구현을 포함하고 있습니다.)
특수문자 저장 비교
먼저 캐릭터셋이 AL32UTF8인 경우 대상 특수문자들이 정상적으로 출력되는 것을 확인할 수 있었는데요.
캐릭터셋이 KO16KSC5601 또는 KO16MSWIN949으로 설정된 경우 'Hyphenation Point(U+2027)', 'Bullet(U+2022)' 특수문자가 깨지는 것을 확인할 수 있었습니다.
번외(Character Set 조회 및 변경 명령어)
-- Character Set 조회
sql > select * from nls_database_parameters where parameter = 'NLS_CHARACTERSET';
-- Character Set 수정
sql > update props$ set value$='KO16MSWIN949' where name='NLS_CHARACTERSET';
-- 수정 후
sql > commit;
sql > shutdown immediate;
sql > startup;
* Character Set의 경우 sysdba 권한을 가진 계정을 통해 변경할 수 있으며, 캐릭터셋 변경(특히 지원되는 문자 집합이 적은 캐릭터 셋으로 변경) 시 기존의 데이터가 깨질 수 있기 때문에 주의가 필요한 부분입니다.
< 참고 자료 >
https://rastalion.dev/oracle-character-set-%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC/
https://wordtips.tistory.com/entry/%EC%9B%8C%EB%93%9C-%EA%B8%B0%ED%98%B8-%EA%B0%80%EC%9A%B4%EB%8E%83%EC%A0%90-%C2%B7%E3%86%8D
'Programming > Oracle' 카테고리의 다른 글
Oracle 전체 테이블, 테이블 별 데이터 수 조회(ALL_TABLES, ALL_TAB_COLUMNS) (0) | 2025.01.14 |
---|---|
Oracle TABLESPACE란? 테이블스페이스 개념 정리 (1) | 2024.11.17 |
서브쿼리 종류와 개념 정리(스칼라 서브쿼리, 인라인 뷰, 일반 서브쿼리) (0) | 2024.10.20 |
LISTAGG 함수 사용 방법 및 예시(여러 행의 값을 하나의 문자열로 결합할 때) (0) | 2024.09.15 |
CLOB, BLOB 데이터 타입과 mybatis에서 CLOB, BLOB 사용 방법 (0) | 2024.08.15 |