2008. 7. 21. 21:28

JDBC 드라이버의 한글 처리

한글 처리 과정

사용자 삽입 이미지


자바 프로그램이 사용하는 인코딩은 유니코드 2.0 이고 데이터베이스는 그 종류에 따라 KSC5601, UTF8, 8859-1 등의 인코딩을 사용. 따라서, JDBC 드라이버는 데이터베이스 전송시 자바 프로그램과 해당 데이터베이스 간의 인코딩을 변환해야 할 필요가 있음.

Oracle 드라이버의 문사셋 환경

사용자 삽입 이미지


데이터베이스 문자셋이 "US77ASCII"나 "WE8ISO8859P1" 일 때와 "KO16KSC5601"일 때 다음과 같이 달라 질 수 있음.

1. 데이터베이스 문자셋이 "US7ASCII"나 WE8ISO8859P1"이라면 JDBC 드라이버가 데이터를 무조건 "UTF16"로 변환시킨 후 이것을 클라이언트측의 JDBC PROGRAM에 전달

2. 데이터베이스의 문자셋이 "KO16KSC5602"이라면, 먼저 데이터를 "UTF8"으로 변환한 후 "UTF16"로 다시 변환해서 데이터를 JDBC 프로그램에 넘겨줌. 이렇게 하기 위해서는 클라이언트의 NLS_LANG 환경변수가 "US7ASCII"나 "WE8ISO8859P1"이 아닌 값으로 설정이 되어야 한다. 그래서, orcal oci 드라이버는 클라이언트의 NLS_LANG을 "KO16KSC5601"이나 "UTF8"로 설정하면 JDBC 드라이버가 데이터를 "UTF8"로 변환한 후에 다시 "UTF16"으로 변환해서 JDBC 프로그램에 데이터를 전달한다.

* Oracle thin 드라이버의 경우에는 클라이언트의 환경과 상관없이 데이터베이스의 문자셋이 "KO16KSC5601"로만 설정되어 있으면 한글을 이용하는 데 큰 문제가 없음. 이럴 경우 JDBC PROGRAM에서 데이터베이스로 한글 데이터 전송시에는 해당 한글을 UTF8로 인코딩하면서 크기가 많이 증가하고 이러한 문자를 받은 Oracle 데이터베이스는 상당히 큰 크기의 문자를 전달받게 된다.

ex) varchar2(10)의 길이로 만들어진 컬럼에 JDBC 프로그램을 통하여 '가나다라마'라는 데이터를 만들어서 JDBC 드라이버를 거쳐서 데이터베이스로 전달하는 경우, 데이터베이스의 varchar2(10)의 길이로 만들어진 컬럼에는 '가나다라마'라는 데이터 크기가 너무 커서 삽입할 수 없다는 오류를 볼 수 있다.

이런 경우 다음과 같이 문자셋을 변환해 넣어주면 정상으로 동장

String name = "가나다라마";
String name_KS = new String(name.getBytes("8859_1"), "KSC5601");


이렇게 문자셋을 설정하여 변경하면 "UTF8"로 변환되는 과정을 막으므로 해당 쿼리가 에러 없이 정상으로 실행된다. 하지만 한글이 1300자 내외를 넘을 경우에는 CLOB이라는 데이터 Type을 사용할 수 있음.