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

번호 제목 글쓴이 날짜 조회 수
23 MySQL Database Migration Wizard 황제낙엽 2019.04.05 78
22 MySQL 워크벤치(Workbench) 황제낙엽 2019.04.05 66
21 MySQL을 로컬이 아닌 외부에서 접속하기 위한 확인 사항 황제낙엽 2018.11.30 770
20 phpMyAdmin file 황제낙엽 2007.11.11 472
19 DataType 과 최대값, 최소값 황제낙엽 2007.09.03 207
18 mysql에 오라클의 rownum같은 필드를 추가하기 (java code) 황제낙엽 2007.05.19 185
17 MySQL에서 Data Too Long 이라는 오류를 만났을 경우...(MYSQL5) 황제낙엽 2007.04.04 519
16 MySQL 원격 접속하기 황제낙엽 2007.03.09 270
» mysql latin1을 utf-8로 바꾸기 황제낙엽 2007.01.29 267
14 MYSQL_FRONT(3.0) 원격데이타베이스 관리 툴입니다. 황제낙엽 2005.11.18 108
13 Mysql 관리용 툴들 황제낙엽 2005.11.30 70
12 mysql 프롬프트에서 외부의 sql스크립트 파일 실행하기 황제낙엽 2005.11.22 504
11 MySQL 초보가이드 (임시업로드) 황제낙엽 2003.06.17 90
10 쿼리예제모음 황제낙엽 2004.11.29 43
9 mysql database를 검사후 재시작하는 스크립트 황제낙엽 2004.11.22 244
8 cmd창에서 mysql을 root계정으로 접속하는 방법 황제낙엽 2004.11.18 94
7 mysql의 fragmentation (파일 조각 모음) 황제낙엽 2004.11.18 133
6 mysql db state 체크 및 복구 황제낙엽 2004.11.18 14
5 쉘프롬프트에서 sql스크립트 파일 실행하기 황제낙엽 2004.11.18 59
4 인덱스관련 황제낙엽 2004.11.18 15