Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Redmine설치후 MySQL인코딩 문제로 한글이 깨져서 나올 때

Redmine을 설치한 후에 한글이 모두 ???로 나오는 문제가 발생했습니다. 메뉴나 저장소의 파일에 있는 한글들은 이상이 없었지만 DB에서 꺼내온 이슈종류의 이름이나 저장소의 커밋 메시지에 있는 한글의 경우는 모두 ???로 나타났는데 다른 인코딩 설정으로 해결이 안되는 것으로 보아 MySQL의 인코딩이 맞지 않는 문제로 보였습니다.

MySQL에 접속(sudo mysql -p)하여 MySQL에서 캐릭터셋에 대해서 조회(show variables like 'c%';)를 해보면 아래와 같이 latin1으로 나타납니다. MySQL같은 경우는 기본적으로 latin1 캐릭터셋을 사용하도록 설치가 되더군요.(이유까진 잘 모르겠습니다.)

MySQL의 캐릭터셋을 조회하여 latin1로 나온 화면

Redmine의 디비설정 파일인 /etc/redmine/default/database.yml 에 encoding을 UTF-8로 설정을 해놓았기 때문에 MySQL의 인코딩 타입과 맞지 않아서 발생한 문제인듯 합니다. MySQL의 인코딩인 latin1으로 맞출수도 있지만 장기적으로 생각해 보았을 때는 이왕 해결할 때 UTF-8로 맞추는 것이 더 나은 해결책으로 생각되었습니다. 인코딩을 맞춰주기 위해서 일단 MySQL의 인코딩을 UTF-8로 맞추어 주어야 합니다. /etc/mysql/my.cnf 파일에서(OS에 따라 my.ini일수도 있습니다.) 각 부분에 아래의 내용을 추가해 줍니다. 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
 
[mysql]
default-character-set=utf8

이렇게 설정하면 이제 MySQL에 관련된 캐릭터셋은 UTF-8을 사용하지만 이미 latin1으로 생성된 디비는 바꿀수가 없기 때문에 삭제후에 다시 생성해야 합니다. (디비명이 redmine이라고 가정하고 이 경우는 데이터가 전혀 없기 때문에 그냥 지우고 다시 생성하였지만 이미 사용하던 데이터가 있을 경우에는 백업하고 복구하여야 합니다. redmine디비를 사용하도록 바꾸고 캐릭터셋을 조회하면 대부분은 UTF-8로 바뀌었지만 데이터베이스 부분은 여전히 latin1로 되어 있는 것을 볼 수 있습니다.)

drop database redmine;
create database redmine COLLATE utf8_general_ci;

이렇게 다시 생성하고 다시 해당 디비의 캐릭터 셋을(use redmine후에 하여야 합니다. 디비마다 설정이 다르기 때문에)을 하면 아래처럼 모두 UTF-8로 된것을 볼 수 있습니다.

MySQL의 캐릭터셋을 조회하여 utf-8로 나온 화면

이제 UTF-8로 설정된 데이터베이스가 생겼으므로 Redmine에서 사용할 테이블과 기본적인 데이터를 생성해야 합니다. 다행히도 Ruby on Rails에는 migration기능이 들어있기 때문에 Redmine이 설치된 루트에서 아래의 간단한 명령으로 테이블 생성 및 기본데이터를 다시 추가할 수 있습니다.

rake generate_session_store
RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake redmine:load_default_data

이제 redmine디비를 조회해보면 각 테이블및 데이터가 들어간 것을 확인할 수 있고 Redmine페이지에 접속해 보면 아까 깨져서 나오던 한글데이터들이 모두 정상적으로 출력되는 것을 확인할 수 있습니다.
2010/09/25 01:17 2010/09/25 01:17