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)으로 세팅되어 있는 것을 확인할 수 있다.
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=kyungseoDataSource
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” 13 참고 사항
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 참고 사이트

6 comments
1 ping
Skip to comment form ↓
남윤혁
2008/01/15 at 3:29 am (UTC 9) Link to this comment
세종대왕님 사진이 멋지군요!!
박경서
2008/01/15 at 7:19 am (UTC 9) Link to this comment
한글을 사랑합시다~! ^^
김재형
2009/06/18 at 3:13 am (UTC 9) Link to this comment
안녕하세요. 혹시 아래 사항 처리도 가능한지요?
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 환경 셋팅을 어떻게 해야하는지 좀 알려주세요.
감사합니다.
Mr.朴
2009/06/30 at 11:29 am (UTC 9) Link to this comment
댓글이 늦었네요… ^^;
글의 내용 중,
sp_configure “disable character set conversions” 1
과 관계 있지 않을까요? ^^
아니면,
sp_configure “enable unicode conversions”, 1
??
jin
2012/05/08 at 3:30 pm (UTC 9) Link to this comment
좋은 정보 감사해요~^^
담아갑니다~~^^
박경서
2012/05/08 at 9:04 pm (UTC 9) Link to this comment
오래전 포스트인데, 도움이 되었나보네요… ^^
hereaway님의 블로그
2007/12/06 at 4:06 pm (UTC 9) Link to this comment
jtDS 글임