제목을 적는데 무척 고민했습니다.
누군가가 웹의 자료를 검색 했을때 쉽게 찾고 정확한 자료를 제공해 주고 싶기 때문입니다.
이 글의 제목을 '인코딩 문제'가 아닌 '한글 문제'라고 적는게 검색하는 사람들에게 더 도움이 될 듯하지만 정확하게 말하자면 한글만의 문제가 아닌 인코딩 문제이기 때문입니다. (은근슬적 본문에 '한글 문제'라고 적는 재치!)
EUC-KR이 기본 문자셋인 MySQL에 JDBC로 아래와 같이 접속하여 데이터를 삽입하면 한글이 깨져서 기록되는 문제가 발생합니다.
String Url = "jdbc:mysql://주소:포트번호/DB이름";
Connection Conn = DriverManager.getConnection(Url, "아이디", "암호");
우선 Connector/J 버전에 따라 아래의 내용이 맞지 않을 수 있습니다.
저는 MySQL 4.0.26, Connector/J 5.0.3 버전에서 테스트 하였습니다.
String Url = "jdbc:mysql://주소:포트번호/DB이름";
String Property = "?characterEncoding=EUC_KR";
Connection Conn = DriverManager.getConnection(Url + Property, "아이디", "암호");
2번 라인의 속성을 추가해줘야 MySQL이 데이터를 저장할때 EUC-KR로 파일에 저장됩니다.
(※ EUC-KR이 아닌 EUC_KR 입니다. Connector/J의 버전에 따라 EUCKR인 것도 있습니다.)
characterEncoding에 대해서는 아래와 같은 설명이 있습니다.(제가 영어를 너무 못해서 원문과 같이 올립니다. 번역보고 웃지 말아주세요.ㅠㅠ)
If 'useUnicode' is set to true, what character encoding should the driver use when dealing with strings? (defaults is to 'autodetect')
- 신뢰없는 해석 : useUnicode가 ture라면 문자열을 교환시 드라이버가 어떤 문자 인코딩을 사용하는지?(기본값은 자동찾기)
useUnicode는 기본값이 true이므로 굳이 useUnicode=true&characterEncoding=EUC_KR 라고 쓸 필요는 없습니다.
useUnicode에 대해서는 아래와 같은 설명이 있습니다.
Should the driver use Unicode character encodings when handling strings? Should only be used when the driver can't determine the character set mapping, or you are trying to 'force' the driver to use a character set that MySQL either doesn't natively support (such as UTF-8), true/false, defaults to 'true'
- 신뢰없는 해석 : 문자열 접근시 드라이버가 어떤 유니코드 문자 인코딩을 사용하는가? 드라이버가 문자를 매치시키지 못할때나, 문자셋 이용을 드라이버로 당신이 '강제' 시도할때 MySQL이 어느한쪽만을 지원하지 못하므로(UTF-8 처럼) 사용된다(?), true/false, 기본값은 'true'이다
죄송합니다. 제가 봐도 무슨 말인지 모르겠습니다. 번역을 신뢰하지 말아주세요.
왜 이런 문제가 발생하는 것일까요? 저도 이 부분이 궁금합니다.
나름대로 가설을 세워봤습니다.
우선 JSP 즉, JAVA에서 문자를 유니코드로 처리합니다.
넘어온 값의 인코딩이 무엇이던지 메모리에 저장되는건 유니코드 입니다.
이 유니코드 데이터를 MySQL에 전달할테고 MySQL은 데이터를 파일에 출력하기 위해서 적절한 인코딩을 선택할 것입니다.
그런데 MySQL은 데이터를 출력할 DB파일의 기본 인코딩이 무엇인지 알고 있을텐데 왜 깨져서 기록되는 것일까요?
이 문제에서 막혀버리고 말았습니다.
영어실력이 딸려서 이런 복잡한 부분은 찾아볼 엄두가 나지 않습니다.
누구 확실히 아시는 분이 계시다면 가르쳐 주시길 바랍니다. :)
이 유니코드 데이터를 MySQL은 바이트로 기록하기 위해 어떠한 인코딩으로 처리할 것인지 우리는 Connector/J의 characterEncoding에 원하는 인코딩을 설정하여 저장합니다.
불러올 때도 마찬가지로 MySQL에서 불러온 바이트 데이터를 JAVA의 문자열로 변환하기 위해서 인코딩을 알려주어야 합니다.
#참고자료 http://dev.mysql.com/doc/connector/j/en/connector-j-reference-charsets.html
누군가가 웹의 자료를 검색 했을때 쉽게 찾고 정확한 자료를 제공해 주고 싶기 때문입니다.
이 글의 제목을 '인코딩 문제'가 아닌 '한글 문제'라고 적는게 검색하는 사람들에게 더 도움이 될 듯하지만 정확하게 말하자면 한글만의 문제가 아닌 인코딩 문제이기 때문입니다. (은근슬적 본문에 '한글 문제'라고 적는 재치!)
문제점
EUC-KR이 기본 문자셋인 MySQL에 JDBC로 아래와 같이 접속하여 데이터를 삽입하면 한글이 깨져서 기록되는 문제가 발생합니다.
String Url = "jdbc:mysql://주소:포트번호/DB이름";
Connection Conn = DriverManager.getConnection(Url, "아이디", "암호");
해결방법
우선 Connector/J 버전에 따라 아래의 내용이 맞지 않을 수 있습니다.
저는 MySQL 4.0.26, Connector/J 5.0.3 버전에서 테스트 하였습니다.
String Url = "jdbc:mysql://주소:포트번호/DB이름";
String Property = "?characterEncoding=EUC_KR";
Connection Conn = DriverManager.getConnection(Url + Property, "아이디", "암호");
2번 라인의 속성을 추가해줘야 MySQL이 데이터를 저장할때 EUC-KR로 파일에 저장됩니다.
(※ EUC-KR이 아닌 EUC_KR 입니다. Connector/J의 버전에 따라 EUCKR인 것도 있습니다.)
잡다한 내용
characterEncoding에 대해서는 아래와 같은 설명이 있습니다.(제가 영어를 너무 못해서 원문과 같이 올립니다. 번역보고 웃지 말아주세요.ㅠㅠ)
If 'useUnicode' is set to true, what character encoding should the driver use when dealing with strings? (defaults is to 'autodetect')
- 신뢰없는 해석 : useUnicode가 ture라면 문자열을 교환시 드라이버가 어떤 문자 인코딩을 사용하는지?(기본값은 자동찾기)
useUnicode는 기본값이 true이므로 굳이 useUnicode=true&characterEncoding=EUC_KR 라고 쓸 필요는 없습니다.
useUnicode에 대해서는 아래와 같은 설명이 있습니다.
Should the driver use Unicode character encodings when handling strings? Should only be used when the driver can't determine the character set mapping, or you are trying to 'force' the driver to use a character set that MySQL either doesn't natively support (such as UTF-8), true/false, defaults to 'true'
- 신뢰없는 해석 : 문자열 접근시 드라이버가 어떤 유니코드 문자 인코딩을 사용하는가? 드라이버가 문자를 매치시키지 못할때나, 문자셋 이용을 드라이버로 당신이 '강제' 시도할때 MySQL이 어느한쪽만을 지원하지 못하므로(UTF-8 처럼) 사용된다(?), true/false, 기본값은 'true'이다
죄송합니다. 제가 봐도 무슨 말인지 모르겠습니다. 번역을 신뢰하지 말아주세요.
왜 이런 문제가 발생하는 것일까요? 저도 이 부분이 궁금합니다.
나름대로 가설을 세워봤습니다.
우선 JSP 즉, JAVA에서 문자를 유니코드로 처리합니다.
넘어온 값의 인코딩이 무엇이던지 메모리에 저장되는건 유니코드 입니다.
이 유니코드 데이터를 MySQL에 전달할테고 MySQL은 데이터를 파일에 출력하기 위해서 적절한 인코딩을 선택할 것입니다.
그런데 MySQL은 데이터를 출력할 DB파일의 기본 인코딩이 무엇인지 알고 있을텐데 왜 깨져서 기록되는 것일까요?
이 문제에서 막혀버리고 말았습니다.
영어실력이 딸려서 이런 복잡한 부분은 찾아볼 엄두가 나지 않습니다.
누구 확실히 아시는 분이 계시다면 가르쳐 주시길 바랍니다. :)
이 유니코드 데이터를 MySQL은 바이트로 기록하기 위해 어떠한 인코딩으로 처리할 것인지 우리는 Connector/J의 characterEncoding에 원하는 인코딩을 설정하여 저장합니다.
불러올 때도 마찬가지로 MySQL에서 불러온 바이트 데이터를 JAVA의 문자열로 변환하기 위해서 인코딩을 알려주어야 합니다.
#참고자료 http://dev.mysql.com/doc/connector/j/en/connector-j-reference-charsets.html
MySQL to Java Encoding Name Translations.
| MySQL Character Set Name | Java-Style Character Encoding Name |
| ascii | US-ASCII |
| big5 | Big5 |
| gbk | GBK |
| sjis | SJIS (or Cp932 or MS932 for MySQL Server < 4.1.11) |
| cp932 | Cp932 or MS932 (MySQL Server > 4.1.11) |
| gb2312 | EUC_CN |
| ujis | EUC_JP |
| euckr | EUC_KR |
| latin1 | ISO8859_1 |
| latin2 | ISO8859_2 |
| greek | ISO8859_7 |
| hebrew | ISO8859_8 |
| cp866 | Cp866 |
| tis620 | TIS620 |
| cp1250 | Cp1250 |
| cp1251 | Cp1251 |
| cp1257 | Cp1257 |
| macroman | MacRoman |
| macce | MacCentralEurope |
| utf8 | UTF-8 |
| ucs2 | UnicodeBig |




최근 덧글