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 참고 사이트
"Development Story" 카테고리의 다른 글
Comments
Sybase 어때요? 좋나요??
조치아나... -_-
질문이 있는데용.
계속 데이터 결과값이 한글깨짐현상이 나와서...
Driver Param: 드라이버 파라미터의 값으로 "?CHARSET=eucksc"를 입력한다.
이렇게 해두 계속 깨지고요..
Charset: Character set의 값으로 eucksc를 선택한다.
이 설정부분은 아예 없는데요??;
뭔가 다른방법이 있을까요??
동일한 버전이 맞나요?
다른 방법은 잘 모르겠구요, 제가 있는 곳에 계신 분들도 저와 동일하게 세팅해서 한글 문제 없이 잘 사용하고 있습니다. :)
올리신 글을 뒤늦게 확인했습니다... ^^;
지금쯤 해결하셨기를 바랍니다.
자료 검색하다가 우연히 들어왔습니다..
블로그도 운영하고 계셨네요..^^
자료 좀 많이 퍼갈께요.. 수고하세요.^^
블로그 방문하고 왔는데, 열심이네.. ^^)b
난 게을러서 글 게시한지가 언제인지...
가물가물~~ -_-;