현상
특정 문자열 데이터가 제대로 보이지 않는 현상 입니다.
•
Case 1: 조회 시에는 동일하게 보이지만 실제로는 다른 데이터가 들어간 경우
•
Case 2: 한컴오피스 문서 등의 내용을 AP를 통해 그대로 insert 하는 업무에서 특정 특수 문자가 제대로 보이지 않는 경우
-- 현상 예시
drop table tibero.pk_test
create table tibero.pk_test(id1 varchar2(10), id2 varchar2(10), data1 varchar2(10), data2 varchar2(10))
alter table tibero.pk_test add constraint pk primary key(id1, id2)
insert into tibero.pk_test values ('key1','key2',1,1)
insert into tibero.pk_test values ('key1 ','key2',1,1)
insert into tibero.pk_test values ('key1 ','key2',1,1)
insert into tibero.pk_test values ('key1','key2',1,1) -- 깨진 문자는 한글에서 복사/붙여넣기 한 특수 문자
insert into tibero.pk_test values ('key1','key2',1,1) -- 깨진 문자는 한글에서 복사/붙여넣기 한 특수 문자
commit
desc tibero.pk_test
COLUMN_NAME TYPE CONSTRAINT
ID1 VARCHAR(10) PRIMARY KEY
ID2 VARCHAR(10) PRIMARY KEY
D1 NUMBER D2 NUMBER
INDEX_NAME TYPE COLUMN_NAME
PK1 NORMAL ID1 ID2
select id1,id2 from tibero.pk_test
ID1 ID2
1 key1 key2
2 key1 key2
3 key1 key2 --1,2,3의 데이터 차이를 눈으로 인지하기 힘들다
4 key1 key2
5 key1 key2 --4,5의 ID1 마지막 문자가 깨진 상태
SQL
복사
원인
•
Case 1: 공백문자(전각), 공백문자(반각), tab 문자는 전부 다른 문자이나, 조회 시 인지하기가 어렵습니다.
(위 예시의 1,2,3번째 줄)
•
Case 2: 한컴오피스에서는 UNICODE에서 미사용 중인 주소값에 한글 전용 문자를 지정해 사용하는 영역이 있습니다. 이 경우, 한컴오피스에서는 해당 바이트 값을 읽고 해당하는 문자가 표출되나 UTF8 등에서는 미사용 영역이므로 문자가 제대로 보이지 않습니다.
미지원 문자이므로 insert 시 해당 값에 적합한 문자가 없어 제대로 출력이 안되지만, 값 자체는 가지고 있으므로 그대로 입력됩니다.
참고
사용자가 입력한 대로 그대로 들어간 케이스로, character set 은 주소 코드를 읽고 거기에 맞는 문자를 출력하는 형태입니다.
해결
오류는 아닌 character set 처리 특성으로 필요 시 to_char(rawtohex(string))으로 바이트코드를 확인해 분석합니다.
key1 이라는 값은 6B657931 라는 byte 값을 가진다
1 : E38080 = 일본어 문자셋에서 사용하는 전각 공백 문자
2 : 20 = space
3 : 09 = tab 문자
4 : F3B08AB1 = UTF8에서는 미사용 영역 / UNICODE로는 U+F02B1 으로 미사용 영역 / 한글에서는 네모칸 숫자 1로 사용. 5번과 동일해 보이지만 실제로는 다른 문자가 들어간 상태
5 : F3B08AB2 = UTF8에서는 미사용 영역 / UNICODE로는 U+F02B2 으로 미사용 영역 / 한글에서는 네모칸 숫자 2로 사용. 4번과 동일해 보이지만 실제로는 다른 문자가 들어간 상태
select id1,id2,length(id1),lengthb(id1),to_char(rawtohex(id1)) from tibero.pk_test
ID1 ID2 LENGTH(ID1) LENGTHB(ID1) TO_CHAR(RAWTOHEX(ID1))
1 key1 key2 5 7 6B657931E38080
2 key1 key2 5 5 6B65793120
3 key1 key2 5 5 6B65793109
4 key1 key2 5 8 6B657931F3B08AB1
5 key1 key2 5 8 6B657931F3B08AB2
SQL
복사