JDBC 통합 한글 해결책


[ 다음 글들 ] [ 이어서 글올리기(답하기) ] [ 자바 묻고 답하기 ]

글쓴이 :김덕태 1998년 4월 22일 17:01:33

ConversionConnection.java는 JDBC 통합 한글 해결책을 목적으로 만든
것입니다.


JDBC 드라이버 및 DBMS 마다 한글을 사용하기 위한 방식이 서로
다르므로, 통합되고 간편한 방법으로 한글을 사용하기 위해서는
ConversionConnection.java를 이용하실 수 있습니다.
( http://calab.kaist.ac.kr/~dtkim/java/example/jdbc/ConversionConnection.java )


사용방법은 다음과 같습니다.


java.util.Properties props = new java.util.Properties();
props.put("charSet", "KSC5601" ); // 데이타베이스 인코딩 지정
// 드라이버 혹은 DBMS에 따라서는 이러한 지정이 필요없거나,
// 지정하지 않는 것이 더 적절한 경우가 있다.
// 드라이버 혹은 DBMS에 따라서는 "KSC5601" 대신에
// "UTF8"등 다양한 인코딩을 지정할 수도 있다.

// Connection con = DriverManager.getConnection( db_url, props );
// 한글 처리 (다국어 처리 포함)를 위해 대신 다음과 같이 한다.
Connection con = ConversionConnection.getConnection( db_url, props );


// 나머지 부분은 영문 처리하는 경우와 동일하다.


ConversionConnection.java으로 한글이 해결되지 않는 경우에는 소스
코드를 보면 여러가지 해결 방법들이 들어 있으며, 그 범주에 속할
것이므로 적절히 수정하여 사용하면 됩니다.


Execute.java는 사용 예제입니다.
( http://calab.kaist.ac.kr/~dtkim/java/example/jdbc/Execute.java )


다음은 이해를 돕기위해서 ConversionConnection.java의 앞부분만을 떼어낸 것입니다.



/*
* @(#)ConversionConnection.java 1.3 98/03/10
*
* Program Type: Package
*
* Purposes:
* 1. JDBC 명세 및 드라이버들의 다국어 및 한글 지원 부족에 대처한다.
* 2. JDBC 드라이버들의 인코딩 (문자 집합) 처리의 다양성을 보완함으로써,
* 한글 및 다양한 언어 환경하에서도 데이타베이스 독립성을 얻는다.
* 3. 드라이버의 버그를 보정한다.
*
* 실행 환경:
* 자바 1.1 이상
*
* What to do:
* InstantDB, mSQL, Postgres, Oracle, FastForward, jConnect이외에
* 한글 사용에 문제가 있는 드라이버들을 보정할 수 있도록 확장.
*
* Author: Deogtae Kim , 98/03/10
*/


import java.sql.*;
import java.io.*;



/**
* Abstract Code Conversion Class
*/


abstract class ConversionConnection implements Connection
{
public static Connection getConnection( String dbUrl, java.util.Properties props )
throws SQLException
{

Driver driver = DriverManager.getDriver(dbUrl);
String driverClass = driver.getClass().getName();
String charSet = props.getProperty( "charSet" );


if ( driverClass.equals( "jdbc.idbDriver" ) )
{ // InstantDB 및 내장 드라이버
// : 유니코드로 저장되므로, charSet등의 설정이 없어도
// : 한글 및 다국어를 제대로 처리한다.
} else if ( driverClass.equals( "com.sybase.jdbc.SybDriver" ) )
{ // Sybase용 jConnect 드라이버 3.0
// : 다음과 같이 JCONNECT_VERSION 프로퍼티를 설정한 후에는,
// charSet 프로퍼티를 설정하면 지정된 인코딩으로 변환하고,
// 설정하지 않으면 데이타베이스의 디폴트 인코딩으로 변환한다.
// 다음은 이와 같은 설정 및 자바 표준과 문자 인코딩 이름을
// 달리하므로 이를 보정한다.
props.put( "JCONNECT_VERSION", "3" );
if ( charSet != null && charSet.equals( "KSC5601" ) )
props.put( "charSet", "eucksc" );
else if ( charSet != null )
props.put( "charSet", props.getProperty( charSet.toLowerCase() ) );
} else if ( driverClass.equals("sun.jdbc.odbc.JdbcOdbcDriver")
&& System.getProperty("java.version").compareTo( "1.2" ) >= 0 )
{ // JDK 1.2에 내장된 JDBC-ODBC 브리지
// : "charSet" 프로퍼티로 변환될 데이타베이스 인코딩을 지정할 수 있다.
} else if ( driverClass.equals( "com.imaginary.sql.msql.MsqlDriver" ) )
{ // mSQL JDBC 드라이버 1.0b3
// : 디폴트로 8859_1 인코딩으로 변환하여 저장한다.
// : "encoding" 프로퍼티로 데이타베이스 인코딩을 지정할 수 있다.
// 다음은 "encoding" 프로퍼티 대신 "charSet" 프로퍼티를 사용할 수 있게 한다.
if ( charSet != null )
props.put( "encoding", props.getProperty( "charSet" ) );
} else if ( driverClass.equals( "weblogic.jdbc.dblib" ) )
{ // Sybase, Microsoft SQL Server용 WebLogic jdbcKona 드라이버 3.01 (유형 2)
// : 디폴트로, 8859_1 인코딩으로 변환하는 것으로 추측됨.
// : "weblogic.codeset" 프로퍼티로 데이타베이스 인코딩을 지정할 수 있다.
if ( charSet != null )
props.put( "weblogic.codeset", props.getProperty( "charSet" ) );
} else if ( driverClass.equals( "connect.sybase.SybaseDriver" ) )
{ // Sybase SQL 서버용 FastForward 드라이버 3.0
// : 데이타베이스 디폴트 인코딩으로 바르게 변환하여 저장되는 것으로 추측됨.
// : charSet 프로퍼티를 지원하지 않는 것으로 추측됨.
} else if ( driverClass.equals("oracle.jdbc.driver.OracleDriver") )
{ // 오라클 Thin 드라이버 혹은 OCI7 드라이버 7.3.4
// : 데이타베이스의 디폴트 인코딩과 변환한다.
// : charSet 프로퍼티를 지원하지 않는다.
// : - 데이타베이스의 디폴트 인코딩이 KSC5601인 경우 (보통의 경우):
// : (즉, NLS_DATABASE_PARAMETERS 테이블의 "NLS_CHARACTERSET" 열의 값이
// : "KO16KSC5601"인 경우에 해당)
// : 한글 표현이 자바의 유니코드 2.0와 다른 1.2를 사용하므로 이를 보정한다.
// : 그러나, 오라클 드라이버의 버그로 인해, CHAR, VARCHAR 자료형의 크기를
// : 50% 증가시켜야 하며, 드라이버의 버그로 인해 PreparedStatement가
// : 오동작한다.
return new OracleConversionConnection( DriverManager.getConnection( dbUrl, props ) );


// : - 데이타베이스의 디폴트 인코딩을 8859_1로 변경한 경우:
// : (즉, NLS_DATABASE_PARAMETERS 테이블의 "NLS_CHARACTERSET" 열의 값이
// : "WE8ISO8859P1"인 경우에 해당)
// : 앞의 KSC5601을 return문을 삭제하고, 다음 return문의 코멘트를 제거한다.
// : 이와 같이 하면, 이상의 문제가 발생하지는 않는다.
// : 다음은 데이타베이스 인코딩 변경으로 인해 한글을 사용할 수 있도록
// : 코드 변환으로 보정한다.
/*
return new GeneralConversionConnection(
DriverManager.getConnection( dbUrl, props ),
(charSet == null) ? "KSC5601" : charSet, "8859_1" );
*/
} else if ( driverClass.equals( "connect.microsoft.MicrosoftDriver" ) )
{ // MS SQL 서버용 FastForward 드라이버 3.0
// : 무조건 8859_1로 변환하는 것으로 추측됨.
if ( charSet != null && ! charSet.equals("8859_1") )
return new GeneralConversionConnection(
DriverManager.getConnection( dbUrl, props ), charSet, "8859_1" );
} else if ( driverClass.equals( "weblogic.jdbc.ifmx" ) )
{ // Informix용 webLogic jdbcKona 드라이버 (유형 2)
System.err.println( "Warning: Not yet verified. 8859_1 conversion is taken." );
if ( charSet != null && ! charSet.equals("8859_1") )
return new GeneralConversionConnection(
DriverManager.getConnection( dbUrl, props ), charSet, "8859_1" );
} else if ( driverClass.equals( "weblogic.jdbc.oci" ) )
{ // Oracle용 webLogic jdbcKona 드라이버 (유형 2)
// : 디폴트로, 8859_1 인코딩으로 변환한다.
// : "weblogic.oci.useUTF8" 연결 프로퍼티 및
// : "NLS_LANG" 환경 변수에 의해 코드 변환이 영향받는다.
// 다음은 8859_1 인코딩으로 변환하게 하고, 코드 변환을 보정한다.
if ( charSet != null && ! charSet.equals("8859_1") )
return new GeneralConversionConnection(
DriverManager.getConnection( dbUrl, props ), charSet, "8859_1" );
} else if ( driverClass.equals( "openlink.jdbc.Driver" ) )
{ // OpenLink 드라이버 3.0
// : 무조건 8859_1로 변환하는 것으로 추측됨. (확인 필요)
System.err.println( "Warning: Not yet verified. 8859_1 conversion is taken." );
if ( charSet != null && ! charSet.equals("8859_1") )
return new GeneralConversionConnection(
DriverManager.getConnection( dbUrl, props ), charSet, "8859_1" );
} else if ( driverClass.equals( "weblogic.jdbc.t3.Driver" ) )
{ // WebLogic Tengah JDBC 드라이버
// Tengah 서버측에 설치되는 JDBC 드라이버에 한글 처리가 필요하다.
} else if ( driverClass.equals( "postgresql.Driver" ) )
{ // Postgres 및 내장 드라이버
// : 클라이언트 디폴트 인코딩에 의해 결정된다.
String clientEncoding = new java.io.OutputStreamWriter(System.out).getEncoding();
if ( props.getProperty( "charSet" ) != null
&& ! props.getProperty( "charSet" ).equals(clientEncoding) )
throw new SQLException( "client encoding and charSet value should be"
+ " the same in this driver" );
} else if ( driverClass.equals("sun.jdbc.odbc.JdbcOdbcDriver") )
{ // JDK 1.1 내장 JDBC-ODBC 브리지
// : 클라이언트 디폴트 인코딩에 의해 결정되는 것으로 추측됨.
System.err.println( "Warning: Not yet verified. No action is taken." );
} else
{
// 기타 드라이버들
System.err.println( "Warning: Not yet verified. No action is taken." );
}


return DriverManager.getConnection( dbUrl, props );
}

.......


--
Deogtae Kim (김덕태)
CA Lab. CS Dept. KAIST
http://calab.kaist.ac.kr/~dtkim/java



다음 글들:



이어서 글올리기(답하기)

이름:
E-Mail:
제목:
내용:
관련 URL(선택):
URL 제목(선택):
관련 이미지 URL:


[ 다음 글들 ] [ 이어서 글올리기(답하기) ] [ 자바 묻고 답하기 ]