본문 바로가기
APM

MySQL euc-kr 데이타 UTF-8로 컨버팅 하기

by 누피짱 2009. 4. 23.

기존 MySQL 환경에서는 Database측 CHARSET 이 latin1 이나 euckr을 많이사용했을 겁니다.

Legacy DB쪽은 아무 생각없이 CREATE DATABASE ... ; 해버렸었던 경우가
많아서 latin1 으로 되어 있는 database가 저또한 엄청나게 많았습니다.

그런데, 이럴 경우 utf8을 제대로 쓸 수 없다거나, command line utility에서
꼭 문제가 발생하여서 utf8로 전환을 시도했습니다.

문제는 latin1 db에 client 는 utf8을 사용하고 있던 경우,
db에는 utf8로 들어가나, 정상적인 utf8이 아님으로써,
mysql 이나 query browser등에서 쿼리를 할 수 없었습니다.

한번은 잘못해서 database하나를 몽땅 못쓰게 만들어 버린 적도 있었죠.

이곳 게시판을 잘 읽어 본 결과 아래와 같이 하여 성공적으로 conversion을 하였습니다.

**. 준비물
vim 혹은 editplus 등 utf-8을 지원하거나, 변환가능한 editor
test한 MySQL 버젼 아무거나(기존), MySQL 4.1.12 , 5.0.16 (utf-8사용할 것)

A. DB는 latin1으로 만들어져 있고, client는 utf8을 사용하였던 경우

(1). 가장 먼저 mysql로 접속 한 후 use {database}, show variables like 'c%'; 로 확인을 합니다.
아마도 대부분 Database와 character_set_connection 이 latin1으로 되어 있을 겁니다.

(2). 기존 DB를 Dump받습니다.
mysqldump -u{username} -p{password} {dbname} --default-character-set latin1 > {dump}.sql
이때 Dump 받는 SQL은 database의 chracter set이 아니라, client가 실제로 사용한
character set. 즉 이경우에는 utf8로 저장되어 있게 됩니다.

(3). {dump}.sql 을 편집합니다.

3-1. SET NAMES latin1; 으로 되어 있는 놈을 SET NAMES utf8; 로 변경합니다.

3-2. CREATE DATABASE ..... DEFAULT CHARSET=latin1; 으로 되어 있는 놈을
CREATE DATABASE ..... DEFAULT CHARSET=utf8; 로 변경합니다.
vim 사용자라면, command line에서 1,$s/CHARSET=latin1/CHARSET=utf8/g 하면 바꿀 수 있습니다.
이렇게 하므로써, 다시 생성될 TABLE의 CHARSET도 utf8로 맞출 수 있게 됩니다.

(4). MySQL로 로그인 하여 새로 부어줄 DATABASE를 생성합니다.
CREATE DATABASE {utf8-dbname} DEFAULT CHARACTER SET utf8;

(5). dump 한 data를 부어넣습니다.
mysql -u{username} -p{password} {utf8-dbname} < {dump}.sql

B. DB는 latin1으로 만들어져 있고, client는 euckr을 사용하였던 경우
제로보드가 대표적인데, 다음과 같이 합니다.

(1). 가장 먼저 mysql로 접속 한 후 use {database}, show variables like 'c%'; 로 확인을 합니다.
아마도 대부분 Database와 character_set_connection 이 latin1으로되어 있을 겁니다.

(2). 기존 DB를 Dump받습니다.
mysqldump -u{username} -p{password} {dbname} --default-character-set latin1 > {dump}.sql
이때 Dump 받는 SQL은 database의 chracter set이 아니라, client가 실제로 사용한
character set. 즉 이경우에는 euckr로 저장되어 있게 됩니다.

(3). {dump}.sql 을 편집합니다.

3-1. SET NAMES latin1; 으로 되어 있는 놈을 SET NAMES euckr; 로 변경합니다.

3-2. CREATE DATABASE ..... DEFAULT CHARSET=latin1; 으로 되어 있는 놈을
CREATE DATABASE ..... DEFAULT CHARSET=utf8; 로 변경합니다.

vim 사용자라면, command line에서 1,$s/CHARSET=latin1/CHARSET=utf8/g
하면 바꿀 수 있습니다.
이렇게 하므로써, 다시 생성될 TABLE의 CHARSET도 utf8로 맞출 수 있게 됩니다.

(4). MySQL로 로그인 하여 새로 부어줄 DATABASE를 생성합니다.
CREATE DATABASE {utf8-dbname} DEFAULT CHARACTER SET utf8;

(5). dump 한 data를 부어넣습니다.
mysql -u{username} -p{password} {utf8-dbname} < {dump}.sql

C. 모두 끝난 다음에 절차...
이 게시판에 많이 나와 있는 방법대로 했습니다. 더 좋은방법도 있을 겁니다.
/{mysqld-my.cnf path}/my.cnf

[client]
default-character-set=utf8

[mysqld]
init_connect=SET collation_connection=utf8_general_ci
init_connect=SET NAMES utf8
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci

로 바꾸어 줍니다.
/{init script path}/{init script} restart
아마 리눅스 사용자면 /etc/init.d/mysqld restart 일 것이고,
저처럼 NetBSD 사용자이면 /etc/rc.d/mysql restart 일겁니다.

D. client application의 접속단 변경...
Legacy 프로그램때문에 문제가 되는 게 많은데,
제로 보드의 경우 다음과 같이 바꾸어 줍니다.

{Zeroboard installed path}/lib.php 를 열고,
function dbconn() 을 찾습니다.
@mysql_select_db($f[4], $connect) or Error("DB Select 에러가 발생했습니다","");
이라고 되어 있는 부분 (즉, return $connect; 문 바로 앞)에다가 다음과 같이 넣습니다.
@mysql_query("set names euckr;",$connect);

모두 해피하게 사용하실 수 있을 겁니다.

가장 중요한 것은 show variables like 'c%' ; 해서
character_set_client 와 character_set_connection 과 character_set_database의
속성을 잘 파악하여야 한다는 것입니다.

아무쪼록 소중한 DATA 깨먹는 일 없도록 하시기 바라면서 이만 줄이겠습니다.

저의 시행착오가 다른 분들에게 조금이나마 도움이 되길 바랍니다.

이 문서는 여러분 모두의 경험을 바탕으로 정리한 것이기 때문에
써보시고 유익하시다면 많은 분들이 도움을 얻을 수 있게 해주세요.


출처 : datbase.sarang.net
작성자 : 박인서(bubux)
작성일 : 2006-01-11 20:15:40
Title : Utf8 환경으로 자료 conversion 성공기
Sub Title : MySQL환경을 UTF-8로 전환하기

제 개인 적으로 테스트 한 결과 위와 같은 방법으로 하는 것도 좋습니다. 다만 데이터를 Dump할때는 해당 Client와 DB의 Character-set에 주의해야 합니다.

저희 DB를 할때는 Characterset을 따로 지정하지 않고 덤프 뜬후 Vi를 통해 Characterset을 UTF-8로 변경하고 그 데이터를 그대로 DB에 넣은 후 제로보드 소스(lib.php)에서 수정하여 표기 하였습니다.

뭐... Iconv를 이용해서 컨버팅 하는 방법도 테스트를 해봐야 겠지만 급한 경우 이렇게 처리 하는것도 하나의 방법이겠네요 ^^

댓글