오라클 캐릭터셋 관련 참고사항
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이 사람 여럿 잡습니다.
'배워야 산다 > ORACLE' 카테고리의 다른 글
오라클 trc로그 삭제 (0) | 2013.09.10 |
---|---|
date형 시간차이를 초로 계산 (0) | 2013.01.24 |
오라클 캐릭터 셋 변경하기 (0) | 2013.01.24 |
tablespace 90% 넘었을때 조치방법 (0) | 2012.04.05 |
오라클 설치 후 실행 및 중지 (0) | 2011.06.23 |