본문 바로가기
배워야 산다/ORACLE

export한 파일 캐릭터셋 변경 저장(import)

by 인라인타지마 2013. 1. 24.

오라클 캐릭터셋 관련 참고사항

http://cafe.naver.com/prodba.cafe?iframe_url=/ArticleRead.nhn%3Fclubid=12321220%26page=3%26menuid=0%26inCafeSearch=true%26searchBy=3%26query=%B9%AF%C1%F6%B8%B6%26includeAll=%26exclude=%26include=%26exact=%26searchdate=all%26media=0%26sortBy=date%26articleid=1374%26referrerAllArticles=true

>us7ascii에서 UTF-8로 export/import 하는방법?

>character set이 us7ascii의 DB를 chracter set이 UTF-8인 DB로 

export/import하려고 합니다.

>그냥 단순히 full export후에  import만으로만 작업이 가능한지?

아니면 별도의 작업이 필요한지요?

 

무조건 깨집니다. us7ascii 자체가 한글을 지원하지 않는 characterset 입니다.

table에 한글이 들어가 있다고 해도 그건 이미 한글이 아닙니다.

us7ascii 코드 중 그 해당 한글과 맞는 코드가 있어 한글처럼 보일뿐입니다.

 

us7ascii의 data를 utf-8로 imp 하려면 예전에 otn bulletin에 있던 아래의 convert.c 를 이용하여 us7ascii에서 받은 export dump 파일

 

을   ko16ksc5601로 convert 한 후 다시 utf8로 imp 하는 방법이 있고 다른 한가지는 us7ascii로 된 DB 자체를

 

alter database character set KO16KSC5601; 로 ko16ksc5601로 변경한 후 exp/imp를 하는 방법이 있습니다.

 

아래는 convert.c 입니다.

 

---------------------------------------------------------------------------------------------------------------------

#include<sys/types.h>

#include<sys/fcntl.h>

#include<stdio.h>

#include<string.h>

int us7_to_ksc, ksc_to_us7; /* conversion flag */

main(argc,argv)

int argc;

char *argv[];

{

 us7_to_ksc = ksc_to_us7 = 0;

 if(argc != 3) {

   usage(argv[0]);

   exit(1);

 }

 if(!strcmp(argv[2],"KSC5601")) 

   us7_to_ksc = 1;

 else if(!strcmp(argv[2],"US7ASCII"))

   ksc_to_us7 = 1;

 else

   usage(argv[0]);

 data_conversion(argv[1]);

 printf("conversion completed successfully !!!\n");

}

usage(prog_name)

char *prog_name;

{

 printf("Usage: %s exported-file-name charset\n", prog_name);

 printf("     - charset : KSC5601|US7ASCII \n");

 printf("       . KSC5601 - convert us7ascii format to ksc5601  format\n");

 printf("       . US7ASCII - convert ksc5601 format to us7ascii format\n");

}

data_conversion(usfile)

char *usfile;

{

 int fd;

 char conv_buffer[2];

 if((fd = open(usfile, 2)) < 0) {

  perror("open");

  exit(1);

 }

 if(lseek(fd, 1, 0) < 0) {

  perror("lseek");

  exit(1);

 }

 if(us7_to_ksc){

  conv_buffer[0] = 3;

  conv_buffer[1] = 'H';

 }

 else if(ksc_to_us7){

   conv_buffer[0] = '\0';

   conv_buffer[1] = 1;

 }

 if(write(fd,conv_buffer,2) != 2) {

   perror("write");

   exit(1);

 }

 close(fd);

}

 

위의 내용을 convert.c로 저장 하시고

 

cc -o convert convert.c로 compile 하신 후

 

convert  dumpfile명 KSC5601 하시면

 

us7ascii에서 받은 dump file이  ko16ksc5601로 변경이 됩니다.

 

convert.c를 사용하는대 있어 제한 사항은 8i dump file까지만 위의 program을 사용할 수 있다는 것입니다.

 

만약 9i 이상의 버전을 사용하실 경우 8i client를 설치 하시던가 아니면 8i가 깔려 있는 곳에서 exp scott/tiger@test 이런식으로

 

exp를 받으신 후 변경 하시면 됩니다.

 

실제 dump 파일의 character set을 확인 하는 방법은 다음과 같습니다.

 

---------------------------------------------------------------------------------------------------------------

 

EXPORT받은 DUMP 파일의 CHARACTER SET 확인 방법 

============================================= 


다른 server에서 export받아온 dump file을 import시킬 경우 자주 겪게 되는 

문제가 CHARACTERset에 관련된 것이다. 

양쪽의 CHARACTERset이 같고 .profile의 환경변수(NLS_LANG)도 맞다고 

생각되는 데도 import 시 segment fault가 발생되거나 

imp-16, 36, 37, 38, 42, 43, 45, 49 등의 error가 발생되면 dump받아온 file을 

의심해볼 필요가 있다. 


이 때 dump file을 8진수로 변환해 보면 현재 export받은 file의 

CHARACTERset을 쉽게 알 수 있다. 



오라클 export file은 특별한 CHARACTER set을 사용해서 쓰여진다. 

version 5, 6에서는 export 시 단지 두개의 CHARACTER set-ASCII와 EBCIDC-만이 

지원되었으나, version 7에서는 지원하는 모든 CHARACTER set이 export 시에 

사용될 수 있다. export 시 사용된 CHARACTER set은 dump file 내에 code로써 

기술되는데 file의 첫 byte가 이것을 나타낸다. 


1st byte 의미 

---------------------------------------------------- 

1 version 5, 6의 ASCII CHARACTER set 

2 version 5, 6의 EBCDIC CHARACTER set 

3 version 7의 CHARACTER set. 


"3"일 경우 두, 세번째 byte를 보고서 CHARACTER set을 판단한다. 

아래에는 우리가 흔히 접하는 character set에 대한 CHARACTER set ID이다. 


2nd 3rd value 

-------------------------------------------------- 

000 001 US7ASCII 

000 002 WE8DEC 

000 037 WE8ISO8859P1 

003 110 KO16KSC5601 

003 147 UTF8 (oracle8.0 이상부터 지원) 

: : 

: : 


export file을 체크하기 위해서는 다음의 unix command를 사용한다. 



$ od -b expdat.dmp|more 


0000000 003 000 001 105 130 120 117 122 124 072 126 060 067 056 060 062 

0000020 056 060 062 012 104 112 115 113 111 115 012 122 124 101 102 114 

          : 

          : 

위의 경우 1st byte가 003이므로 version 7이며, 3rd byte가 001이므로 ID가 

1번인 US7ASCII가 CHARACTER set이 된다. 


(비고: 

  HP-UX에서 TEST 결과 DB CHARACTERSET이 무엇으로 지정되었건 EXPORT 시는 

  USER의 .PROFILE에 있는 환경 변수를 기준하여 DUMP FILE을 WRITE하므로 

  EXPORT 실시 때의 OS USER의 환경변수인 NLS_LANG 값이 상당히 중요함.) 

 

 

그놈의 character set이 사람 여럿 잡습니다.



--> 퍼온 내용... 출처는 생각나지 않음..

반응형