본문 바로가기

IT관련

오라클 utl_file.get_line() 한글 텍스트 제대로 못 읽는 경우 - 한글깨짐, 캐릭터셋 문제

Oracle DB 의 PL/SQL 프로그램에서 utl_file.get_line() 함수로 텍스트를 한줄씩 읽는 경우 제대로 안읽히는 경우가 있습니다. 한글이 깨지거나 여러줄이 한꺼번에 읽히는 문제가 있습니다.

 

이것은 DB의 캐릭터셋(Characterset) 환경과 Text 파일의 문자코드가 맞지 않아서 발생하는 현상입니다.

 

아래와 같이 간단한 PL/SQL 프로그램을 이용해서 테스트 해보겠습니다.

 


set serveroutput on

declare
  f      utl_file.file_type;
  ldir   varchar2(100) := 'DATA_PUMP_DIR';
  lfile  varchar2(100) := 'readfile.txt';
  v_line varchar2(2000);
begin
  f := utl_file.fopen(ldir, lfile, 'r');
  loop
    begin
      utl_file.get_line(f, v_line);
      dbms_output.put_line('-------------' || v_line);
    exception when no_data_found then exit;
    end;
  end loop;
  utl_file.fclose(f);
end;
/

 

위 프로그램은 readfile.txt 라는 텍스트파일에서 한 라인씩 읽어서 화면에 '------------' 를 앞에 붙여서 출력하는 간단한 PL/SQL 프로그램입니다.

 

readfile.txt 텍스트파일은 윈도우즈에서 Acroedit 라는 툴로 다음과 같이 만들었습니다.

 

 

여기서 주목할 부분이 밑에 ANSI-DOS-949 라고 되어 있는 부분입니다.

윈도우즈에서 Text 파일을 만들면 디폴트로 ANSI 기반의 MS-Win949 캐릭터셋으로 파일이 만들어집니다.

 

하지만, 위 PL/SQL 프로그램을 실행할 제 DB는 UTF8 캐릭터셋을 사용합니다.

 

 

따라서, 실행할 DB와 텍스트파일의 캐릭터셋이 다릅니다.

어떤 현상이 발생하는지 확인해 보겠습니다.

 

 

원래 파일은 총 5줄인데 4줄로 출력되었습니다.

한글부분에서 2줄이 한꺼번에 읽히면서 한줄로 인식되었습니다.

 

이것을 제대로 처리하려면 텍스트파일의 한글캐릭터셋을 DB처럼 UTF8 로 변환해줘야 합니다.

Acroedit 에는 이런 기능이 있습니다.  

 

 

[파일] - [변환] - [유니코드 UTF-8] 을 선택해주면, ANSI ... 으로 되어 있던 부분이 아래와 같이 U8... 으로 변경됩니다.

 

 

파일을 저장하고, 이 파일로 다시 테스트 해보겠습니다.

 

 

정상적으로 5줄이 잘 읽히고, 한글도 깨지지 않고 잘 출력되는 것을 확인할 수 있습니다.