BLOG ARTICLE charset | 1 ARTICLE FOUND

  1. 2007/08/07 MySQL DB를 백업-복원 했는데 한글이 깨져나온다? (10)

 
 
 
 

예전에 MySQL v3.x 때에는 없던 문제가 요즘 들어 생긴다. MySQL에 보강된 기능으로 characterset 에 변화가 가해졌기 때문이다. 어떤 보완이 추가되었는지는 MySQL 사이트에서 알아보고 여기선 왜 한글이 깨져나오는지 그리고 어떻게 이문제를 바로잡을 수 있는지에 대해서 풀어보겠다.

한글이 깨지는 원인은 sql 파일을 백업할 당시의 mysql 서버의 charset과 백업된 sql파일을 복원시키는 서버의 mysql charset 이 달라서 나타나는 현상인것 같다.

sql 파일을 열어보면
DEFAULT CHARSET=euckr
또는
SET NAMES euckr
식으로 charset 지정된 부분이 있다.
(없을경우에는 백업하실때 characterset 에 대한 설정이 없이 dump 를 했다는 것으로 간주할 수 있다. )

백업할때 아래와 같이 default-character-set 값을 주어 한글이 깨지는 것을 막을 수 있다.

mysqldump -uadmin -p DB명 --default-character-set euckr > dump_filename.sql


위에서 euckr 또는 latin1 등의 문자셋 선택은 우선 sql 파일을 백업할 서버의 쉘에서 mysql에 로그인 한 후,
mysql> 프롬프트 상에서 아래와 같이 입력하고 엔터를 친다.

mysql> status
--------------
mysql  Ver 14.12 Distrib 5.0.27, for redhat-linux-gnu (x86_64) using readline 5.0

Connection id:          32
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.0.27
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    euckr
Db     characterset:    euckr
Client characterset:    euckr
Conn.  characterset:    euckr
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 42 min 46 sec

Threads: 4  Questions: 893  Slow queries: 0  Opens: 288  Flush tables: 1  Open tables: 57  Queries per second avg: 0.348
--------------

위 내용중 characterset 관련된 부분의 데이터를 보고 sql 파일의 문자셋 값을 결정한다.
즉 서버의 문자셋이 euckr 이면 백업부터 복원까지 모두 euckr로 맞추어야한다.

리눅스 서버의 루트 권한으로 /etc/my.cnf 를 열고 아래와 같이 한글 문자셋을 지정해 준다.

[client]
default-character-set=euckr

[mysqld]
init_connect=SET collation_connection=euckr_korean_ci
init_connect=SET NAMES euckr
default-character-set=euckr
character-set-server=euckr
collation-server=euckr_korean_ci
language=korean

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

[mysql.server]
user=mysql
basedir=/var/lib

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

저장하고 mysqld 를 재시동한다.
참고: language=korean 옵션은 mysql 에서의 메세지 등을 한글로 보고자 할 경우 추가해 주면 되겠다.


복원하는 서버에서도 마찬가지로 문자셋을 지정해서 복원한다.

mysql -uadmin -p DB명 --default-character-set euckr < dump_filename.sql



mysql v4.1.x 은 v4.0.x 에서 처럼 default character set 하나만 바꿔주면 문자셋은 끝나지만,
4.1.x 이후에서 부터는 문자셋을 서버/데이터베이스/테이블/connection/ 심지어 필드
하나하나, 스트링 하나하나까지도 character set과 collation을 설정할 수 있게
되어 있어서 고생을 한다.
또한, 4.0에서 를 4.1로 데이터를 옮기는 과정에서 한글이 깨지는 현상이 발생한다.
해결한 방법을 하나 하나 기술해 보면....
 
=> my.cnf ( my.ini )에 보면
default-character-set=latin1
 
기본값이 latin1 이것을 euckr로 바꾼다. ( 4.1.x 에서는  euc_kr 을 euckr로 변경 )
my.cnf 에서 필요한 character-set 을 전부 위의 my.cnf 예와 같이 수정한다.
 
=> DB 생성시
mysql> create database DB_NAME character set euckr collate euckr_korean_ci;
 
이미 생성한 DB 나 Table 은 다음과 같이 수정한다.
mysql> ALTER DATABASE <DB명> CHARACTER SET euckr COLLATE euckr_korean_ci;

mysql> ALTER TABLE <테이블명> CONVERT TO CHARACTER SET euckr;


mysql 을 설치하기 전에 문자셋에 대해 검색을 하고 설치하는것이 좋겠다.


위와같이 했는데도 웹페이지에서 한글이 "??????" 로 나온다면 DB 연결 스크립트에서 아래와 같이 해보는 것도 권장한다.
$connect=mysql_connect($host, $user, $pass);
mysql_query("set names euckr", $connect);


DB 전체의 기본 문자셋 변경은
mysql> alter database DB명 default character set euckr collate euckr_korean_ci;