MySQL인코딩 문제
을 설치한 후에 한글이 모두 ???로 나오는 문제가 발생했습니다. 메뉴나 저장소의 파일에 있는 한글들은 이상이 없었지만 DB에서 꺼내온 이슈종류의 이름이나 저장소의 커밋 메시지에 있는 한글의 경우는 모두 ???로 나타났는데 다른 인코딩 설정으로 해결이 안되는 것으로 보아 MySQL의 인코딩이 맞지 않는 문제로 보였습니다. MySQL에 접속(sudo mysql -p)하여 MySQL에서 캐릭터셋에 대해서 조회(show variables like 'c%';)를 해보면 아래와 같이 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에 이미 다른 설정들이 있으므로 각 부분에 맞게 추가해 주기만 하면 됩니다.
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로 된것을 볼 수 있습니다.
이제 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페이지에 접속해 보면 아까 깨져서 나오던 한글데이터들이 모두 정상적으로 출력되는 것을 확인할 수 있습니다.
출처 : http://blog.naver.com/seogi1004?Redirect=Log&logNo=110045319589 최근에 Connection Pool 연동에 이어서 CharacterSet 설정까지 몇 일 동안 삽질의 연속이었습니다. 정말 오랜만에 프로그래밍 공부를 하면서 좌절을 맛본거 같네요. 아... 멀고도 험난한 Web Programming의 길 ㅠ.ㅜ;; 어쨌든 저와 같이 헤매는 사람이 더 이상 나오지 않기를 바라며 이렇게 글을 씁니다. 최대한 이해하기 쉽게 자세히 순차적으로 설명하였으니 분명히 도움이 되시리라 생각됩니다. 그럼, 시작합니다. 본 강좌는 UTF-8 인코딩 설정으로 쓰여졌고, 다른 인코딩 설정 방법 또한 아래의 설명들과 다를 것이 없음도 알려드립니다. 1. MySQL의 CharacterSet을 UTF-8로 설정하기 MySQL 설치시 Character Set / Collation을 utf8로 설정한다. 만약에 설치가 되어있다면 MySQL Server Instance Config Wizard에서 다시 설정할 수 있다. [그림] Character Set 설정 옵션 설정 후 MySQL Query에서 show variables like 'c%' 를 입력하면 아래와 같은 화면이 출력 된다. 2. 톰캣의 세팅을 UTF-8로 바꾸기 톰캣의 conf라는 폴더를 보면 server.xml과 server-minimal.xml 이란 파일을 볼 수 있다. 텍스트 에디터로 열어서 <connector...>라는 항목을 찾아 다음과 같이 설정하자. server.xml <Connector port="8080" maxHttpHeaderSize="8192" server-minimal.xml <Connector port="8080" URIEncoding="UTF-8"> server-minimal.xml이 존재하지 않거나 server.xml만 바꾸었을때 제대로 동작하면 server-minimal.xml은 세팅할 필요 없다. 이 세팅은 웹페이지의 URL에서 문자열을 읽어올 때 서버가 처리하는 URL의 인코딩 타입을 변경하는 것이다. Internet Explorer에서 "URL을 항상 UTF-8로 보냄"이 켜져 있으면 브라우저는 서버에 UTF-8로 보낸다. 이를 서버에서 읽어들일때 UTF-8이 세팅되어 있어야 하는 것이다. 이제 기본 세팅과의 차이점을 보자. 페이지 설정과 POST방식으로 전송된 데이터의 처리는 그대로 두어도 좋다. 서버를 UTF-8로 세팅한 만큼 가급적 UTF-8의 방식으로 페이지 설정을 하자. GET방식으로 전송된 데이터의 처리는, 다음 항목이 필요가 없어진다. 당연하다. 있으면 오히려 에러가 발생할 것이다. 앞부분에 주석처리를 해버리자. request.setCharacterEncoding("UTF-8"); //Latin-1(8859_1)로 읽어들인 데이터를 다시 UTF-8로 재해석하는 코드 한글 파일의 전송은 다음과 같이 처리한다. <a href = "http://[server]:[port]/[folder]/<%= java.net.URLEncoder.encode( "한글파일.html" , "UTF-8" )%>"> 한글파일 링크</a> 이렇게 하면 URLEncoder에 의해서 %xx%xx 형식의 UTF-8로 인코딩된 URL코드가 링크될 것이다. 그외에 Internet Explorer에서는 “URL을 항상 UTF-8로 보냄”이 기본 체크 되어있으므로 주소창에 한글을 직접 써도 서버에서 알아서 처리해준다. 물론 저 항목을 끄면 또 에러 발생.. (FireFox에서는 OS에 따라 MS949로 보낼 수도 있으므로 주의하자.) 3. 개발 툴에서 인코딩 방식을 변경한다. [그림] EditPlus에서의 저장 인코딩 옵션 [그림] Eclipse에서 인코딩 세팅화면 4. 작업 문서에서의 설정 ① 페이지 설정 UTF-8을 쓰고자 하는 경우 *.html, *.htm, *.jsp 파일은 UTF-8 형식으로 저장한다. EUC-KR, MS949는 ANSI, MS949등의 기본 형식으로 저장하면 된다. 모든 HTML, JSP에는 아래와 같은 META태그를 넣을 것을 권장한다. <META HTTP-EQUIV="contentType" CONTENT="text/html;charset=UTF-8"> <!--EUC-KR인 경우 UTF-8을 EUC-KR로 바꾼다--> JSP에서는 페이지 상단에 page 지시자를 다음과 같이 넣는다. <%@ page contentType="text/html;charset=UTF-8" %> <!--EUC-KR인 경우 UTF-8을 EUC-KR로 바꾼다--> ② POST 방식의 데이터 전송 POST방식으로 전송된 데이터는 UTF-8이든, EUC-KR이든 다음과 같은 라인을 추가하면 해결 된다. request.setCharacterEncoding("UTF-8"); //EUC-KR인 경우 UTF-8을 EUC-KR로 바꾼다. ③ GET 방식의 데이터 전송 GET방식으로 전송된 데이터는 URL을 통해 전송되기 때문에 위의 방식으론 쓸 수 없다. URL에서의 데이터를 Latin-1(8859_1)인코딩으로 서버에서 처리하기 때문이다. 이를 톰캣의 버그라고 단정짓는 일부 서적의 말은 잘못된것이다. 불러온 데이터를 아래와 같이 처리해 주어야 한다. request.setCharacterEncoding("UTF-8"); String data = new String(request.getParameter("data").getBytes("8859_1"),"UTF-8"); //Latin-1(8859_1)로 읽어들인 데이터를 다시 UTF-8로 재해석하는 코드 //EUC-KR인 경우 UTF-8을 EUC-KR로 바꾼다. ④ 한글 파일 전송 Latin-1(8859_1)로 세팅된 톰캣 서버에서는 URL을 무조건 영어로 처리하므로 한글 파일은 절대로 읽어들일 수 없다. 파일을 영어로 바꾸어 저장하거나, 한글 파일을 영어로 바꾸는 처리를 해주어야 한다. ⑤ DB URL의 인코딩 jdbc:mysql://localhost:3306/DB명?useUnicode=true&characterEncoding=utf8 [ Java 또는 JSP ] jdbc:mysql://localhost:3306/DB명?useUnicode=true&characterEncoding=utf8 [ XML ] XML 문서에서는 기호 ('&')를 표시할 때 &를 사용하기 때문에 일반 코드와 다르다. Java와 JSP의 MySQL 연동시 한글 인코딩 방법은 매우 까다롭습니다. 그렇기 때문에 위에 제시된 내용 중 하나라도 빠뜨리신다면 실행이 제대로 안되실 수도 있습니다. 저 역시 이런저런 방법을 써봐도 제대로 한글 인코딩이 되지 않아서 고생했었답니다. 조금이나마 도움이 되었기를 바라며 이상으로 글을 마치겠습니다.

maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />//String data = new String(request.getParameter("data").getBytes("8859_1"),"UTF-8");

'scrap > MySql' 카테고리의 다른 글
| mysql SSL 암호화 통신하기 (0) | 2011.09.05 |
|---|---|
| My sql encode, decode, password로 암호화 하긔 (0) | 2011.09.05 |
| MySQL 암호화 (0) | 2011.02.17 |
| MySQL 기본. (0) | 2011.02.15 |

