MySQL mysql latin1을 utf-8로 바꾸기

황제낙엽 2007.01.29 13:04 조회 수 : 267 추천:83

sitelink1  
sitelink2  
extra_vars5  
extra_vars6  

MYSQL Character Changing  UTF-8

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 이라고 알려주시는 센스.. ;-)