필자는 CentOS 4.4 에 패키지로 설치된 MySQL v4.1.20을 오랜동안 사용해왔다. 기본 characterset 설정을 계속 사용해 왔고 웹페이지에서 한글로 표시되는데 문제가 없어서 그냥 사용해왔다.

그러나 계속 사용하면서 한글화 작업이 불가피함을 느끼게 되었다.

(문제1) phpMyAdmin 을 설치하고 부터였다. 우선 phpMyAdmin 에서는 DB에 기록되어 있는 한글 데이터가 모두 깨져서 나온다.

(문제2) load data infile 을 쓰게되면 한글 데이터에 한해서 모두 "?????" 로 표시된다.

데이터베이스를 한글화 하는 길만이 이 문제들을 풀 수 있을것 같아서 웹사이트를 닫고 DB서버를 수정했다.


[ DB  한글화 작업 ]

1. DB 백업 :
$ mysqldump -u사용자계정 -p --default-character-set latin1 DB명 > dumped_db.sql

2. /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


3. DB서버 재시동
# service mysqld restart


4. 기존 DB drop 하고 새로 만들기
mysql> drop database DB명;
mysql> create database DB명;


5. 백업한 DB 파일 수정
$ vi dumped_db.sql

:%s/latin1/euckr/g    //파일내의 모든 latin1 을 euckr 로 바꾼다.


6. 수정한 DB백업파일 복원
$ mysql -u사용자계정 -p DB명 < dumped_db.sql


7. 필요한 csv 또는 txt 포멧의 DB파일 복원
mysql> load data local infile "/home/사용자계정/dumped_table.txt" into table 테이블명 fields terminated by "," lines terminated by "\r\n";


위와같이 한 후 웹페이지에서 한글 데이터를 확인했을때 한글이 "?????" 로 계속 나오고 있다면
아래와 같이 스크립트의 DB 연결 부분을 찾아서 수정해준다.
$ vi config.php
<?php
...
...
$connect=mysql_connect($host, $user, $pass);
mysql_query("set names euckr", $connect);
...
...
?>

예전에 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;