자답을 쓰게 되는군요
문제는 configure시 인코딩옵션에 있었읍니다.
우선 컴파일 할때에 많은 분들이 --enable-multibyte=EUC_KR로 설정하시는 것같은데 제 경우에는 위와 같이 옵션을 주면 $PG_HOME/bin/pg_encoding이 만들어지지를 않았읍니다.
version 7.1.3에서입니다. 다른 버전에서 어떨지 알수없읍니다.
$PG_SOURCE/src/bin/pg_encoding/ 에 있는 파일 컴파일 되지 않게 됩니다 그냥 --enable-multibyte 만주고 컴파일 하면 됩니다.
./configure --enable-mutibyte --with-java
그러면 initdb를 할때 -E EUC_KR 옵션을 주어 DB를 생성할수가 있읍니다
[postgres@roadseeker bin]$ psql -l
List of databases
Database | Owner | Encoding
-----------+----------+----------
photodb | postgres | EUC_KR
postgres | postgres | EUC_KR
template0 | postgres | EUC_KR
template1 | postgres | EUC_KR
(4 rows)
를 통해 확인해 볼수 있읍니다
그후 아래코드중 인코딩 부분을 처리하지 않고 입력을 하시면 문제가 없을 것입니다.
--------------------------------------------------------------
import java.io.*;
public class PostgresAtHangl {
public Connection dbCon;
public PreparedStatement stmt;
public PostgresAtHangl () {
try {
String driver ="org.postgresql.Driver";
String dbURL = "jdbc:postgresql://192.168.0.16/photodb";
Class.forName(driver);
dbCon = DriverManager.getConnection(dbURL, "photodb", "photodb");
StringBuffer sql = new StringBuffer(512);
sql.append("UPDATE roll set description = ? where id =110;");
String source = "한글이 입력이되지 않는 이유는 무엇인가 this is difficult thing";
//String target = new String( source.getBytes("8859_1"), "EUC_KR" );
stmt = dbCon.prepareStatement(sql.toString());
stmt.setString(1, source);
int result = stmt.executeUpdate();
//System.out.println(target);
System.out.println(source);
}
catch(Exception e) {
System.out.println("데이타베이스에 연결을 할수가 없습니다." + e);
}
}
public static void main (String[] args) {
new PostgresAtHangl();
System.out.println("성공적으로 업데이트 하였읍니다.");
}
}
------------------------------------------------------------------
-- 이경익 님이 쓰신 글:
>> 다음과 같은 간단한 예제로 테스트를 해보았습니다.
>>
>> db에는 ??로 입력이 됩니다.
>>
>> 콘솔에서는 입력이 정상적으로 이루어지는데
>> jdbc를 이용하여 입력을 하려고하면 문제가 발생합니다.
>>
>> 몇몇 게시판에 올라온 글을 참조해서 만든 예제인데 잘되지를 않아요
>> 왜그럴까요 ?
>>
>> 이와 같은 에러를 격거나 해결하신분은 리플을 달아 주시면 감사히 읽겠읍니다
>>
>>
>>
>>
>> import java.util.*;
>> import java.math.*;
>> import java.sql.*;
>> import java.io.*;
>>
>> public class PostgresAtHangl {
>>
>> public Connection dbCon;
>> public PreparedStatement stmt;
>>
>> public PostgresAtHangl () {
>>
>> try {
>> String driver ="org.postgresql.Driver";
>> String dbURL = "jdbc:postgresql://192.168.0.16/photodb";
>> Class.forName(driver);
>>
>> //게시판에 올라온 글중에 getConnection() 메소드를 오버라이드
>> // 해 보라는 분이 있어 해보았읍니다.
>>
>> dbCon = getConnection(dbURL, "photodb", "photodb");
>>
>> StringBuffer sql = new StringBuffer(512);
>> sql.append("UPDATE roll set description = ? where id =110;");
>> String source = "한글";
>>
>> //그리고 문자를 인코딩하여 db에 저장합니다.
>> String target = new String( source.getBytes("8859_1"), "KSC5601" );
>>
>> stmt = dbCon.prepareStatement(sql.toString());
>> stmt.setString(1, target);
>>
>> int result = stmt.executeUpdate();
>>
>> //각각의 인코딩을 출력해 봅니다.
>> System.out.println(source);
>> //source는 정상적으로 "한글"이 출력됩니다
>>
>> System.out.println(target);
>> //인코딩이 이루어진 것은 "??"로 출력이됩니다.
>>
>> }
>> catch(Exception e) {
>> System.out.println("데이타베이스에 연결을 할수가 없습니다." + e);
>> }
>>
>>
>> }
>>
>> public static void main (String[] args) {
>>
>> new PostgresAtHangl();
>> System.out.println("성공적으로 업데이트 하였읍니다.");
>> }
>>
>> //게시판에 있는 getConncetion() 메소드를 오버라이드하는 부분입니다.
>>
>> public static Connection getConnection(String url, String user, String passwd) throws SQLException {
>>
>> java.util.Properties props = new java.util.Properties();
>> if(user!=null) props.put("user",user);
>> if(passwd!=null) props.put("password",passwd);
>> props.put("charSet","8859_1");
>> return (DriverManager.getConnection(url,props));
>> }
>> }
|