예전에 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@localhostSSL: 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;
http://blog.nice2seeyou.com/mike/trackback/112