일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 데이터베이스
- 태그를 입력해 주세요.
- 성능
- 오류
- miplatform
- Report Designer
- error
- 한글
- 마이플랫폼
- JavaScript
- MIP
- 톰캣
- oracle
- DB
- 자바
- Tomcat
- Book
- 도서
- java
- JEUS
- 기타소득
- 엑셀
- 이클립스
- 에러
- 함수
- 오라클
- 회계
- Eclipse
- Excel
- 튜닝
- Today
- Total
어느 가을날의 전환점
JDBC|Sybase와 한글(Charset) 본문
Sybase와 한글
Sybase와 한글(eucksc, euc-kr) - JDBC Driver(jConnect, jTDS) 설정
1 환경 요약
1.1 기본 환경
1.2 DB character-set 설정
현재 서버의 Sybase DB의 설정을 보면 character-set이 ISO-8859-1(Latine1)으로 세팅되어 있는 것을 확인할 수 있다.
sp_helpsort
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.url=jdbc:sybase:Tds:IP_ADDRESS:PORT_NUMBER/bct?CHARSET=eucksc
jdbc.username=kyungseo
jdbc.password=kyungseo
DataSource
JEUSMain.xml 파일을 열어 다음과 같은 내용으로 데이터소스를 추가하도록 한다.
<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과 무관하므로 이러한 작업이 불필요하다.
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에 속성값을 전송하면 한글 문제가 해결된다.
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로 해본 것이 적중! ^^).
다음은 테스트 코드이다.
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
'Database' 카테고리의 다른 글
ERWIN|참고 사항 링크 모음 (0) | 2015.11.16 |
---|---|
noSQL|noSQL이란? (0) | 2011.08.01 |
데이터베이스|효율적인 채번 방식을 적용한 성능향상 (0) | 2011.06.17 |
DB|ORACLE vs MS-SQL 함수 비교 (0) | 2010.09.08 |
ERWin|Oracle, MS-SQL용 주석(Comment) 생성 및 순서 맞추기 (4) | 2010.09.03 |