어느 가을날의 전환점

JDBC|Sybase와 한글(Charset) 본문

Database

JDBC|Sybase와 한글(Charset)

어느가을빛 2011. 8. 10. 14:01

Sybase와 한글

Sybase와 한글(eucksc, euc-kr) - JDBC Driver(jConnect, jTDS) 설정


1 환경 요약


1.1 기본 환경

  • Database: Sybase Adaptive Server Enterprise v15
  • JDBC driver: jConnect™ for JDBC™ Version 6.05 (jconn3.jar), jTDS(jtds-1.2.2.jar)
  • Java version: 1.5.0_07
  • WAS: JEUS 5.0 (fix #22)


    1.2 DB character-set 설정

    현재 서버의 Sybase DB의 설정을 보면 character-set이 ISO-8859-1(Latine1)으로 세팅되어 있는 것을 확인할 수 있다. 

    sp_helpsort 
    Character Set = 1, iso_1
         ISO 8859-1 (Latin-1) - Western European 8-bit character set.
     Sort Order = 50, bin_iso_1
         Binary sort order for the ISO 8859/1 character set (iso_1).
    ...


    2 한글 사용을 위한 세팅

    상위에 기술한 환경 하에서 DB의 기본 character-set을 한글(eucksc)로 변경할 수 없는 상황을 전제로 하여 한글 사용을 위한 세팅을 프로그램 및 DB로 구분하여 설명한다.


    2.1 프로그램 세팅

    JDBC 드라이버, jConnector의 character-set property를 eucksc로 설정한다.

    아래 두 예제를 참고하도록 한다. database.properties는 JDBC 관련 속성을 설정해 두고 사용하는 예제이며 DataSource의 경우는 WAS의 JNDI에 데이터소스로 등록하여 사용하는 예제이다.

    database.properties

    jdbc.driver=com.sybase.jdbc3.jdbc.SybDriver
    jdbc.url=jdbc:sybase:Tds:IP_ADDRESS:PORT_NUMBER/bct?CHARSET=eucksc
    jdbc.username=kyungseo
    jdbc.password=kyungseo


    DataSource

    JEUSMain.xml 파일을 열어 다음과 같은 내용으로 데이터소스를 추가하도록 한다.

    <resource>
        <data-source>
            <database> 
                <vendor>sybase</vendor>
                <export-name>bctDs</export-name>
                <data-source-class-name>
                    com.sybase.jdbc3.jdbc.SybConnectionPoolDataSource
                </data-source-class-name>
                <data-source-type>ConnectionPoolDataSource</data-source-type>
                <database-name>bct</database-name>
                <data-source-name>
                    com.sybase.jdbc3.jdbc.SybConnectionPoolDataSource
                </data-source-name>
                <description>
                    BCT Sybase Database - NON-XA DataSource - DEV Server
                </description>
                <network-protocol>Tds</network-protocol>
                <port-number>3000</port-number>
                <server-name>127.0.0.1</server-name>
                <user>kyungseo</user>
                <password>kyungseo</password>
                <property>
                    <name>CHARSET</name>
                    <type>java.lang.String</type>
                    <value>eucksc</value>
                </property>
                <connection-pool>
                    <pooling>
                        <min>2</min>
                        <max>30</max>
                        <step>4</step>
                        <period>3600000</period>
                    </pooling>
                </connection-pool>
            </database>
        </data-source>
    </resource>


    2.2 DB 세팅

    ASE 15에서는 Configuration parameters 항목 중 'disable character set conversions' 파라미터의 값을 “1”로 세팅하여야 한다. 'disable character set conversions'의 기본값은 “0”으로 이것은 client에서 Adaptive Server로 데이터가 이동할 때, character set conversions 기능을 사용하겠다는 의미이다. 따라서 이 값을 “1”로 변경하여 데이터가 컨버전 되지 않도록 하여야 한다. 

    참고로 ASE 12.5.x에서는 Database의 기본 charset과 무관하므로 이러한 작업이 불필요하다.
     

    sp_configure "disable character set conversions" 1


    3 참고 사항

    JDBC 드라이버로 벤더(Sybase)에서 제공하는 jConnect의 대안으로 공개(GNU LGPL) 버전인 jTDS를 사용할 수 있다. Sybase ASE의 JDBC 드라이버로 주로 jConnect와 jTDS 두가지를 많이 사용하는데, jTDS는 오픈 소스로써 Microsoft SQL Server ( 6.5, 7, 2000 그리고 2005) 와 Sybase (10, 11, 12, 15)를 지원하는 100% 순수 자바 JDBC 3.0 드라이버(type 4)이다. 

    jTDS(jtds-1.2.2.jar)를 사용할 경우 ASE가 15 버전이라 하더라도 Database의 설정 변경 없이 다음과 같이 URL에 속성값을 전송하면 한글 문제가 해결된다.

    driver=net.sourceforge.jtds.jdbcx.JtdsDataSource
    url=jdbc:jtds:sybase://IP_ADDRESS:PORT_NUMBER/bct;charset=euc-kr
    username=kyungseo
    password=kyungseo


    단, 주의할 것은 jTDS의 경우 sybase에 정의된 character-set인 eucksc가 아닌 euc-kr로 값을 세팅해야한다(처음에 eucksc로 설정하고 테스트하다가 한글이 깨져 나오길래 좌절 모드로 돌입하고, 관련 문서 뒤져보기 직전... 혹시나 하고 euc-kr로 해본 것이 적중! ^^).

    다음은 테스트 코드이다.

    package kyungseo.test.db;
     
    import java.sql.Connection;
    import java.sql.Driver;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
     
    import kyungseo.test.util.HangulUtil;
     
    public class JtdsHanTest {
     
    public static void main(String args[]) {
      try {
     
       DriverManager.registerDriver((Driver) Class.forName(
         "net.sourceforge.jtds.jdbc.Driver").newInstance());
       Connection con = DriverManager.getConnection (
         "jdbc:jtds:sybase://127.0.0.1:3000/db;charset=euc-kr""kyungseo""kyungseo");
       Statement stmt = con.createStatement();
     
       ResultSet rs = stmt.executeQuery("select han_column from table");
     
       if (rs.next()) {
        String value = rs.getString("han_column");
        System.out.println("원래 값: " + value);
        System.out.println("한글 값: " + HangulUtil.ko(value));
       }
       rs.close();
      }
      catch (SQLException sqe) {
       System.out.println("Unexpected exception : " + sqe.toString()
         + ", sqlstate = " + sqe.getSQLState ());
       System.exit(1);
      }
      catch (Exception e) {
       e.printStackTrace();
       System.exit(1);
      }
      finally {
       if ( stmt != null ) try { stmt.close();}catch(Exception e){}
       if ( con != null ) try { con.close();}catch(Exception e){}
      }
      System.exit(0);
    }
     
    }


    4 참고 사이트



  • #출처: http://kyungseo.pe.kr/blog/34
    Comments