database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Columns 24971 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 24971
utf8 환경으로 자료 conversion 성공기
작성자
박인서(bubux)
작성일
2006-01-11 20:15:40
조회수
20,937

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

이 글에 대한 댓글이 총 2건 있습니다.

잘 읽었습니다.

DB가 utf8로 셋팅되어 있다면 mysql query browser 에서도 한글이 정확하게 표시가 되어야 하는게 맞는지요?

물론 보여지는 웹페이지에서도 utf-8인코딩 문서에 한글 정확히 표현되고요.

 

저같은 경우에는 웹페이지는 한글이 잘 표시가되는데 DB내용을 쿼리 브라우저에서 보면 깨져서 보이네요.

http://database.sarang.net/?inc=read&aid=24958&criteria=mysql&subcrit=qna&id=&limit=20&keyword=&page=1

참고해주시길...

유티에프님이 2006-01-12 09:34:08에 작성한 댓글입니다.
이 댓글은 2006-01-12 09:35:03에 마지막으로 수정되었습니다. Edit

네. 모두 utf8로 통일한 결과 MySQL QueryBrowser에서 정확히 한글로 표현되었습니다.

 

아, 근데 글타래를 보니 Win32 에서 테스트 하신 모양인데요.. 저는 모두 *nix 계열에서 했었기 때문에 Win32에 서버가 있을 경우 어떻게 되는지는 모르겠습니다.

박인서(bubux)님이 2006-01-12 17:14:31에 작성한 댓글입니다.
이 댓글은 2006-01-12 17:15:56에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
25164MySQL 4.1 한글 문제 해결 방법 중 하나(RPM 형태로 처리 가능하게끔)
이승로
2006-03-03
37514
25105[참고]MySQL-5.0 에서 한글입력 문제해결
조정권
2006-02-16
15489
25048(정보)FreeBSD 에서 Mysql 4.x 설치시 기본문자셋 지정입니다.
박태섭
2005-12-19
12727
24971utf8 환경으로 자료 conversion 성공기 [2]
박인서
2006-01-11
20937
24921MySQL 로그 문서 해석해 보았습니다.
정왕균
2006-01-01
14713
246434.1이상에서 character-set을 euckr로 모두 맞추기 [4]
이영진
2005-10-31
18911
24502UTF8 환경으로 이전에 관해서... [1]
이경환
2005-10-05
15525
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2017 DSN, All rights reserved.
작업시간: 0.066초, 이곳 서비스는
	PostgreSQL v9.6.2으로 자료를 관리합니다