UTF-8로 설정한 MySQL 4.1 이상 Tomcat 5.0 이상에서 JDBC접속 URL설정
회사의 인턴에 대한 교육을 목적으로 정말 오랜만에 Tomcat , MySQL 조합으로 예제 코드를
작성 하고 있었다.
톰캣이랑 MySQL의 조합을 마지막으로 사용 해 본게 톰캣 3.X 시절의 일이다.
현재의 조합은 톰캣 5.0 + MySQL 4.1.22 에 utf-8 로 캐릭터 셋을 설정 한데다
서블릿 필터와 JDBC 드라이버 버전업으로 예전의 그 악몽같던 JDBC 한글문제는 사라졌을거라 믿었다..
그러나 왠걸.. 코드를 작성하고 돌려보니 java 클래스 단까지는 한글이 잘 전달 되는데
db에 인서트 하는데 아래와 같은 익셉션이 발생...
이때의 connection url은
jdbc:mysql://localhost:3306/subby_test?useUnicode=true&characterEncoding=UTF8
이 문제는 꽤 간단하게 해결 할 수 있었다.
url에 Truncation 옵션을 false 로 주어서 해결 할 수 있었지만 여전히 DB에는 한글이 안들어가고 있다.
생 ㅈㄹ을 다 해 본다. JDBC버전 별로 봐꿔가며 컴파일과 실행.. 그옜날 썼던 new String() 하며
캐릭터셋 바꿔보기.. 그래도 안된다.. 그만큼 짜증도 밀려오고..
잠시 머리를 식히고 다시 차근차근 생각 해 봤다. 우선 톰캣의 JSP와 MYSQL의 캐릭터 셋은
분명히 utf-8인 상황이다. 그럼 순순히 안 될리가 없지않나? 역시나 JDBC 드라이버 문제인가?
JDBC드라이버를 최신의 안정버전인 5.0.6 으로 선택하고 JDBC 메뉴얼을 살피기 시작했다..
그러다 찾게 된 희망의 한 단락
Using the UTF-8 Character Encoding - Prior to MySQL server version 4.1, the UTF-8 character encoding was not supported by the
server, however the JDBC driver could use it, allowing storage of multiple character sets in latin1 tables on the server.
Starting with MySQL-4.1, this functionality is deprecated. If you have applications that rely on this functionality, and can not upgrade
them to use the official Unicode character support in MySQL server version 4.1 or newer, you should add the following property
to your connection URL:
useOldUTF8Behavior=true
쌍.. 장난하냐? 장난해? 이놈은 뻑하면 옵션을 바꿔...
답은 useOldUTF8Behavior 에 있는 듯했다.. 적용하고 돌려보니 깔끔..
이런 옵션이야 메뉴얼에서 찾는게 정석이긴 하지만, MySQL은 버전이나 서버 설정에 따른 옵션 변화가
너무 많아 난감한 경우가 한두번이 아니다..
아~ 내 3시간은 어딜가서 하소연 하나...
최종적으로 문제를 해결한 utf8 과 MySQL JDBC Driver 5.0 에서의 DB URL은
jdbc:mysql://localhost:3306/subby_test?useUnicode=true&characterEncoding=UTF8&jdbcCompliantTruncation=false&useOldUTF8Behavior=true
작성 하고 있었다.
톰캣이랑 MySQL의 조합을 마지막으로 사용 해 본게 톰캣 3.X 시절의 일이다.
현재의 조합은 톰캣 5.0 + MySQL 4.1.22 에 utf-8 로 캐릭터 셋을 설정 한데다
서블릿 필터와 JDBC 드라이버 버전업으로 예전의 그 악몽같던 JDBC 한글문제는 사라졌을거라 믿었다..
그러나 왠걸.. 코드를 작성하고 돌려보니 java 클래스 단까지는 한글이 잘 전달 되는데
db에 인서트 하는데 아래와 같은 익셉션이 발생...
MysqlDataTruncation 발생..
이때의 connection url은
jdbc:mysql://localhost:3306/subby_test?useUnicode=true&characterEncoding=UTF8
이 문제는 꽤 간단하게 해결 할 수 있었다.
url에 Truncation 옵션을 false 로 주어서 해결 할 수 있었지만 여전히 DB에는 한글이 안들어가고 있다.
생 ㅈㄹ을 다 해 본다. JDBC버전 별로 봐꿔가며 컴파일과 실행.. 그옜날 썼던 new String() 하며
캐릭터셋 바꿔보기.. 그래도 안된다.. 그만큼 짜증도 밀려오고..
잠시 머리를 식히고 다시 차근차근 생각 해 봤다. 우선 톰캣의 JSP와 MYSQL의 캐릭터 셋은
분명히 utf-8인 상황이다. 그럼 순순히 안 될리가 없지않나? 역시나 JDBC 드라이버 문제인가?
JDBC드라이버를 최신의 안정버전인 5.0.6 으로 선택하고 JDBC 메뉴얼을 살피기 시작했다..
그러다 찾게 된 희망의 한 단락
Using the UTF-8 Character Encoding - Prior to MySQL server version 4.1, the UTF-8 character encoding was not supported by the
server, however the JDBC driver could use it, allowing storage of multiple character sets in latin1 tables on the server.
Starting with MySQL-4.1, this functionality is deprecated. If you have applications that rely on this functionality, and can not upgrade
them to use the official Unicode character support in MySQL server version 4.1 or newer, you should add the following property
to your connection URL:
useOldUTF8Behavior=true
쌍.. 장난하냐? 장난해? 이놈은 뻑하면 옵션을 바꿔...
답은 useOldUTF8Behavior 에 있는 듯했다.. 적용하고 돌려보니 깔끔..
이런 옵션이야 메뉴얼에서 찾는게 정석이긴 하지만, MySQL은 버전이나 서버 설정에 따른 옵션 변화가
너무 많아 난감한 경우가 한두번이 아니다..
아~ 내 3시간은 어딜가서 하소연 하나...
최종적으로 문제를 해결한 utf8 과 MySQL JDBC Driver 5.0 에서의 DB URL은
jdbc:mysql://localhost:3306/subby_test?useUnicode=true&characterEncoding=UTF8&jdbcCompliantTruncation=false&useOldUTF8Behavior=true
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
-
2008/05/12 16:56애드널의 생각 Tracked from addnull's me2DAY
-
2011/06/30 14:53Mysql 저장시 한글문제 Tracked from IT 잡동산
헐 감사합니다. 저두 이것저것 삽질해보다 저위에 올리신 옵션쓰고나서야 제대로 출력이 되네요
2시간 삽질
Wow 덕분에 잘 해결했습니다.