개발/database

[oracle] 오라클 한글 3byte를 2byte로 변경하여 byte 자르기

가시죠 2021. 1. 17. 15:41
반응형

프로젝트에서 사용하는 DB는 오라클12C 이며, 캐릭터셋은 AL32UTF8로 한글이 3byte이다.

-- 오라클 캐릭터셋 확인 쿼리
select * from nls_database_parameters where parameter = 'NLS_CHARACTERSET';

 

타 시스템으로 데이터 전송 중 자릿수 초과 오류가 발생하였다.

협의 당시 특정 컬럼의 자릿수는 varchar 10 이였는데, 프로젝트에서 사용하는 varchar 10 은 10 char를 의미했었고, 다른 시스템에서는 10 byte였으며, 타 시스템의 캐릭터 셋은 "KO16MSWIN949"로 한글이 2byte였다.

 * KO16KSC5601
   완성형 한글- 일반적으로 많이 사용되며 2350자의 한글, 4888자의 한자, 히라카나, 카타카나, 영문 및 각종 기호를 포함하고 있음.  (한글바이트: 2byte)
 * KO16MSWIN949
   조합형 한글- 완성형을 포함하여 11172자의 한글을 표현함 (한글바이트: 2byte)
 * AL32UTF8 
   Unicode의 CES 중 하나- 11172자의 한글을 지원 (한글바이트: 3byte)

 

CONVERT함수로 캐릭터셋을 변경하고 LENGTHB로 자릿수를 체크한 후

10 byte보다 클 경우 큰 많큼 SUBSTR 함수로 짤라서 전송 하였다.

select
  case when lengthb(convert('한글가나다라1234', 'KO16MSWIN949')) > 10
  then substr('한글가나다라1234',0, length('한글가나다라1234') - (lengthb(convert('한글가나다라1234', 'KO16MSWIN949'))-10) )
  else '한글가나다라1234'
end
from dual;
반응형