MySQL 한글 입력 문제

MySQL에 한글을 입력하면 ?? 로 표시되는 문제가 발생하였다.
결국 인코딩 문제 때문이었고, MySQL의 character를 변경해 주면 해결된다.

사용한 OS은 Ubuntu 9.04로 우분투는 기본적으로 시스템이 utf-8 을 갖는다.

MySQL설치는 시냅틱 패키지 관리자에서 MySQL server를 선택해서 설치하였다. 이렇게 설치하다보니 기본 언어설정을 못하고 지나치게 되었다. 그래서 characterset이 latin1으로 세팅이 되어 있었구 utf-8형태로 한글을 쓰다보니 한글이 깨져서 입력이 되었다.

1. characterset를 utf-8으로 변경
characterset을 바꾸기 위해서는 my.cnf 수정해야 한다. my.cnf 파일은 우분투에서 시냅틱 패키지 관리자로 설치하면 /etc/mysql 에 존재한다. my.cnf 수정은 http://ikinox.tistory.com/entry/mysql-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%84%A4%EC%B9%98utf-8-%EC%84%A4%EC%A0%95 에서 참조하였다.
참고로 설정파일도 함께 올렸다.

설정을 바꾸고 나서 MySQL을 재시작 해줘야 한다.
$sudo /etc/init.d/mysql restart

2. MySQL에 접속해서 characterset이 바뀌었는지 확인
설정이 적용이 되었다면 utf8로 변경이 된다. 내 경우에는 DB characterset은 latin1으로 계속해서 남아있었다. 그래도 결국 한글이 깨지진 않는다.

3. 테이블 생성
테이블을 생성해 줄때 character 설정을 utf8로 설정해 준다. 이부분이 가장 중요하다. 기존에 character 설정을 해주지 않고 테이블을 만들었다면 테이터가 한번 입력된 이후 테이블의 character 설정을 utf8로 변경을 해도 한글이 깨져서 입력될 가능성이 매우 높다. 이럴땐 과감히 drop 테이블을 하고 새롭게 만드는게 나은것 같다.
테이블을 만들때 MySQL Query Browser 와 같은 GUI 프로그램을 사용하면 편하게 설정해서 테이블을 만들 수 있다.



추가로 아래는 한글 입력이 깨지는 테이블과 깨지지 않는 테이블이다. MySQL Query Browser에서 Copy SQL to ClipBoard 을 통해 테이블을 create 한 쿼리를 보면 깨지는 테이블은 attribute에 character set이 latin1으로 되어 있는것을 확인할 수 있고 이때문에 한글이 입력되면 모두 latin1에 매칭되는 utf8 타입의 한글이 없어 ?로 입력되었던 것 같다.

<깨지는 테이블>
CREATE TABLE  `claztec`.`GUESTBOOK` (
  `guestbook_id` int(11) NOT NULL auto_increment,
  `register` datetime NOT NULL,
  `name` varchar(20) character set latin1 NOT NULL,
  `email` varchar(80) character set latin1 NOT NULL,
  `password` varchar(10) character set latin1 default NULL,
  `content` mediumtext character set latin1 NOT NULL,
  PRIMARY KEY  (`guestbook_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

<깨지지 않는 테이블>
CREATE TABLE  `claztec`.`GUESTBOOK` (
  `guestbook_id` int(11) NOT NULL auto_increment,
  `register` datetime NOT NULL,
  `name` varchar(20) NOT NULL,
  `email` varchar(80) NOT NULL,
  `password` varchar(10) default NULL,
  `content` mediumtext NOT NULL,
  PRIMARY KEY  (`guestbook_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

4. 한글 입력
터미널에서 mysql을 실행해서 한글 입력테스트를 해본다. 이때 터미널 역시 인코딩이 UTF-8로 되어야 한다.


※ MEMBER 테이블에 깨진 문자가 입력된 이유는 my.cnf를 utf8로 변경하지 않고 insert를 해서 깨졌다.

5. 웹에서 입력
모든 character 설정 부분을 utf8로 한 후에 입력한다.
GUESTBOOK 테이블에 입력이 되는 프로그램이다. 최범균의 JSP 2.0 프로그래밍 방명록 예제 프로그램이다.

6. 데이터 베이스확인
실제 입력된 한글이 깨졌는지 확인한다.


할때 마다 생각하는 거지만 환경설정이 제일 힘들다. 환경설정에 기력을 쏟고 나면 정작 개발할 시간과 체력은 남지 않는것 같다.

끝으로 한글 인코딩에 관해서 참조한 글 http://cafe.naver.com/javacircle/34047