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 |