MySQL환경을 UTF-8로 전환하기
기존 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 이라고 알려주시는 센스.. ;-)
|