본문으로 바로가기

설명

MySQL 5.x 대에서 기본적으로 생성되는 DB의 문자코드는 'latin1'입니다. 이 경우 한글 쿼리로 작업시 원하는 결과가 출력되지 않습니다. 이 경우 기존 데이터의 경우 백업받아 utf8 코드 형태로 전환해야 합니다.

요약

1. 데이터베이스 문자 코드 확인
2. 기존 데이터베이스 백업, 새 데이터베이스 생성
3. 백업 데이터 수정(euckr 또는 utf8)
4. 백업 데이터 복구
5. MySQL 환경설정(my.cnf) 파일 수정


1. 데이터베이스의 문자코드를 확인합니다.

확인하는 방법은 MySQL에 클라이언트로 접속해서

mysql > use 디비명;
mysql > show variables like 'c%';

설치 후 MySQL 설정(my.cnf 등)을 바꾸지 않았다면 'latin1'로 맞춰져 있습니다.  


2. 기존 데이터베이스를 백업합니다.

리눅스 터미널에서

$ mysqldump -u root -p 디비명 --default-character-set latin1 > 디비명.sql

다른 DB 명이라면 디비를 새로 받들면 되지만 같은 이름의 DB명을 써야한다면 삭제를 해야합니다.

mysql > drop database 디비명;

MySQL에 클라이언트에서 DB를 만듭니다.

mysql > create database 디비명 default character set utf8;


3. 백업받은 데이터를 수정합니다.

$ vi 디비명.sql

MySQL로 접속하는 클라이언트의 문자코드에 따라 달리 처리해 줍니다.

utf8을 사용한다면 SET NAMES latin1; 을 찾아 latin1을 utf8로 바꿉니다. 
euckr을 사용한다면 SET NAMES latin1; 을 찾아 latin1을 utf8로 바꿉니다. 

혹시 모르니 latin1 이란 이름으로 한번 찾기를 해본 후에

1,$s/latin1/utf8/g  로 파일 전체의 문자열을 바꿉니다.


4. 백업데이터를 복구합니다.

$ mysql -u root -p 디비명 < 디비명.sql


5. MySQL 환경설정(my.cnf) 파일을  수정합니다.
우분투 : /etc/mysql/my.cnf
레드햇5 엔터프라이즈 : /etc/my.cnf

$ vi my.cnf

[client]
default-character-set=utf8

[mysqld]
init_connect=SET collation=utf8_general_ci
init_connect=SET NAMES utf8
default-character-set=utf8
character-set-server=utf8                      # 새 DB 생성시 character-set 옵션 없을시 기본값
collation-server=utf8_general_ci

각 [] 항목별로 추가해줍니다.

재기동 합니다. 택1..

# service mysqld restart    <-- 리눅스 계열
# /etc/rc.d/mysql restart    <-- BSD 계열
# /etc/init.d/mysqld restart     <-- 리눅스 계열







이와는 별개로 utf8 과 euckr을 혼용해서 쓰는 방법도 있습니다. 지금은 대부분 euckr에서 utf8로 갈아탄 상황입니다만 필요한 경우 다음을 참고 합니다.

[참고글]MySQL UTF-8,EUC-KR 같이 쓰는 경우 캐릭터셋 문제 해결

요약하자면, 

1. my.cnf 파일의 설정을 바꿉니다.

[mysqld] 항목에
character_set_server=euckr           <-- 새로 DB 생성시 기본값, 주로 쓰는게 utf8이라면 utf8로 지정합니다.
init_connect=SET names binary      <-- 이 부분 추가

2. 디비 백업 또는 전체 디비 백업(mysqldump -A)합니다.

3. 백업 데이터 수정합니다.

3.1 캐릭터셋이 하나라면 건너 뛰어도 무방합니다.

3.2 여러 캐릭터셋 사용시 DB 생성 부분에 캐릭터셋을 수정합니다.
단, 위의 character_set_server 에서 지정한 캐릭터셋으로 DB를 만들기때문에 다른 캐릭터셋으로 할 DB만 수정합니다.

원래:

(..생략..)
CREATE DATABASE /*!32312 IF NOT EXISTS*/ ctest-euc-kr;
(..생략..)
CREATE DATABASE /*!32312 IF NOT EXISTS*/ ctest-utf-8;
(..생략..)

수정:

(..생략..)
CREATE DATABASE /*!32312 IF NOT EXISTS*/ ctest_euc_kr;
(..생략..)
CREATE DATABASE /*!32312 IF NOT EXISTS*/ ctest_utf_8 CHARACTER SET utf8;
(..생략..)

3.3 DB 별로 백업받았다면 하나씩 DB를 만들면서 charset을 지정해 줍니다.

4. DB를 복구합니다.

mysql -p --default-character-set=binary < dump.sql

DB에 따라 다르게 지정할 수도 있습니다.

mysql -p --default-character-set=euckr < dump.sql
mysql -p --default-character-set=utf8 < dump.sql



UTF-8 데이터베이스라도, 해당 디비 세팅을 euc-kr 로 하면 해당 디비는 euc-kr 로 보입니다.

ALTER DATABASE `디비` DEFAULT CHARACTER SET euckr COLLATE euckr_korean_ci
ALTER TABLE `테이블` DEFAULT CHARACTER SET euckr COLLATE euckr_korean_ci

등의 명령어로 바꾸실 수 있고, phpMyAdmin 의 "테이블 작업" 탭에서도 가능합니다.

데이터베이스가 골라진 상태에서 "테이블 작업" 탭을 누르면 데이터베이스의 캐릭터셋을,
테이블이 골라진 상태에서 "테이블 작업" 탭을 누르면 테이블의 캐릭터셋을 바꿀 수 있습니다.
이 캐릭터셋이 제대로 지정되지 않은 경우엔 정렬이나 글자 수 때문에 문제가 생길 수 있으니 주의하세요.


---------------------------------------------------------------------

여기까지입니다. kldp 자료가 날아 갈까해서 옮겨놨습니다. 좀더 자세한 사항은 링크를 참고하면 됩니다.