본문 바로가기
MySQL

EUC-KR -> UTF-8 DB 이전하기

by ethanjoh 2010. 8. 11.
2년 전 퇴사를 했는데, 당시 다니던 회사에서 쓰려고 만들었던 B2B 쇼핑몰을 리뉴얼하고 싶다는 연락을 받고 지금 작업 중이다.

회사를 그만 둔 뒤 창업한 회사에서 쓰려고 바닥부터 새로 개발한 쇼핑몰 프로그램이 있었기에 그걸로 옮기기로 했다.

사실 DB는 한번도 이전을 해본 적이 없어서 어떻게 해야하나...고민을 하다가 실시간으로 기존 DB에서 데이터를 불러와서 새 DB에 insert하면 되지 않나 생각했는데, 같은 호스팅회사를 쓰고 있어도 원격 DB 접속은 지원을 하지 않아 불가능했다.

그 다음으로 생각한 것이 어차피 테이블명 등도 겹치지 않고 하니 DB를 dump해서 새 DB에 넣은 뒤 기존 테이블 데이터들을 가지고 와서 하면 되지 않을까 싶었는데, JSP를 하는 친구로부터 csv 파일을 받아서 작업을 한다는 얘기를 듣고 그렇게 시도를 해보기로 했다. (SQL문을 더 짜지 않고 이게 더 편한 것 같다.)

그런데 예전 DB나 프로그램은 모두 EUC-KR이고 현재는 UTF-8을 사용 중이다.
언어셋에서 문제를 일으킬 것 같아 사전조사를 해봤지만 쓸만한 내용이 없었다.

현재 맥에서 작업 중이기 때문에 일단 구 DB의 테이블을 csv로 다운받고(구분자는 , ), 맥의 Numbers에서 불러와 UTF-8로 다시 변환해서 저장한 파일을 가지고 작업을 진행했다.

사실 회원테이블이나 상품테이블 작업은 위와 같이 했던 것 같은데(적어도 내 기억엔...ㅠㅠ), 아무 문제없이 UTF-8로 insert가 되었는데, 주문테이블을 작업하면서 계속 몇몇 필드의 한글이 제대로 입력이 안되는 문제가 발생했다.

해결책을 찾다가 결국 윈도의 에디트플러스에서 불러와 UTF-8로 저장 후 작업하니 아무런 문제없이 모두 입력이 되었다.

csv 파일을 불러오는 루틴은 매우 간단했다.


$uploaddir = "order_info.csv"; 

$fp=fopen("$uploaddir","r");

while($data=fgetcsv($fp,40000,",")) {
    echo "<pre>";
    print_r($data);
    echo "</pre>";
}
fclose($fp);

위와 같이 한줄한줄 읽어들이면서 배열로 저장된 $data 값을 가지고 새 DB에 매칭해서 insert 해주기만 하면 끝났다.

위의 출력화면은 아래와 같다.

Array
(
    [0] => 20100811130915abc
    [1] => a62f6569ec26b15c8a7675363b0e795c
    [2] => kimkk
    [3] => 626776
    [4] => 60-147번지 지층 
    [5] =>
    [6] => B
    [7] => (1005-xxx-xxxxx) 예금주:홍길동
    [8] =>               
    [9] => D
    [10] => 35295
    [11] => 3529
    [12] => 2010. 8. 11.
    [13] => NULL
    [14] => NULL
    [15] => abc@naver.com
    [16] => 553647075
    [17] => L
    [18] => Y
    [19] =>
    [20] =>
    [21] =>
)

21개의 배열요소에 각각의 데이터들이 들어있어서 이것만 잘 매치를 시켜주면 된다.

물론 상품테이블을 작업할 때 상품코드는 switch문을 돌려 일일이 매치를 시켜주어야 했고, 그 때 그 때마다 이미지 파일들도 서버에 미리 임시폴더를 만들어 저장해 놓은 것을 새로운 프로그램의 경로에 맞게 복사를 해주었다.

98% 정도는 싱크가 완벽히 된 것 같다.

상품상세설명을 옮길 때 문제가 생겼는데, 기존 프로그램에서도 웹에디터를 사용한지라 내용이 html 소스 형태로 들어가 있는데, 이것을 그대로 insert하니 아예 HTML문법 그대로 출력이 되는 경우가 발생했다.

고민 고민하다가 아래와 같은 방법으로 했더니 해결이 되었다.

$contents = htmlspecialchars($data['16'], ENT_QUOTES);

 ... [새 DB에 insert] ...

 ... [새 DB에서 다시 상품 설명을 불러옴] ...

$decoded = html_entity_decode($row2['contents']);

 ... [새 DB에 다시 update] ...

윗 줄은 csv 파일의 상품설명에 들어있는 따옴표나 겹따옴표 < > 등을 &lt; 같은 html 엔티티로 바꿔서 저장을 하는 것이고, 아래는 저장한 상품설명 데이터를  SQL문으로 다시 불러와 디코딩을 해준 뒤 다시 SQL update를 해주었다.


남이 만든 프로그램이 아니라 내가 만들었던 프로그램인지라 정확히 기억이 나지는 않아도 대충 소스를 보면 DB구조 등도 쉽게 이해를 할 수 있어 그다지 어려움은 없었다.

지금도 계속 운영을 하고 있는 상황이기 때문에 매일매일 주문데이터가 쌓여서 어느 정도 테스트가 끝나면 한가위 때 잠시 운영을 멈추고 도메인도 옮기고 그간 새로 쌓인 데이터 등을 다시 받아 싹 옮기면 큰 문제는 없을 것 같다.

현재 주문 데이터를 매치시키는 작업을 하고 있는데, 기존에 테이블 2개에 나눠서 하나는 주문상품정보를 다른 하나는 주문자 정보 등을 각각 가지고 있어서 이 2가지를 어떻게 합쳐서 새로운 DB에 넣을지 고민 중이다.

아...머리 아포...ㅠㅠ