«

»

Dec 03

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

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 참고 사이트


    사용자 삽입 이미지

 

About the author

박경서

Software Engineer

6 comments

1 ping

Skip to comment form

  1. 남윤혁

    세종대왕님 사진이 멋지군요!!

    1. 박경서

      한글을 사랑합시다~! ^^

  2. 김재형

    안녕하세요. 혹시 아래 사항 처리도 가능한지요?

    Sybase 12.5.3을 사용하고 있습니다.
    웹화면에서 “뷁”과 같은 잘못된 한글 입력시 오류가 납니다.

    에러 메세지는 아래와 같이 나옵니다.

    EAO0009 : 예상되지 않은 SQL 실행 오류가 발생하였습니다!
    JZ0BE:BatchUpdateException: 배치 구문 실행 중오류 발생:Error converting characters into server’s character set. Some character(s) could not be converted.

    한글을 입력하는 그대로 Table에 넣어주고 싶은데 Sybase가 너무 똑똑하네요.

    jConnector나 sybase 환경 셋팅을 어떻게 해야하는지 좀 알려주세요.

    감사합니다.

    1. Mr.朴

      댓글이 늦었네요… ^^;

      글의 내용 중,

      sp_configure “disable character set conversions” 1

      과 관계 있지 않을까요? ^^

      아니면,

      sp_configure “enable unicode conversions”, 1

      ??

  3. jin

    좋은 정보 감사해요~^^

    담아갑니다~~^^

    1. 박경서

      오래전 포스트인데, 도움이 되었나보네요… ^^

  1. hereaway님의 블로그

    jtDS 글임

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>