시소당
한글을 입력 했는데 조회시 ??????형태로 나타난다
원인은 데이터베이스 언어 환경과 클라이언트 언어 환경이 일치 하지 않아서 생기는 경우이다
일단 두곳의 언어 환경을 비교 해보는것이 중요한다
현재 DB에 설정되여있는 한글 타입( CHARACTER SET) 이 어찌 되였는지 조회해보자
D:work>sqlplus "/ as sysdba"
SQL*Plus: Release 10.1.0.2.0 - Production on 화 7월 13 09:04:21 2004
Copyright (c) 1982, 2004, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Release 10.1.0.2.0 - Production
SQL> SELECT NAME,VALUE$ FROM PROPS$
WHERE NAME ='NLS_LANGUAGE' OR
NAME ='NLS_TERRITORY' OR
NAME ='NLS_CHARACTERSET';
NAME VALUE$
--------------------------------------------------------------------------------NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CHARACTERSET KO16MSWIN949
NLS_LANGUAGE :데이터 베이스에서 메세지를 보여줄때의 메세지 언어 설정이다 AMERICAN 되여있다
NLS_TERRITORY :금액을 표시 할때 날짜를 표현할때 표현 방법이다
AMERIC 방식은 금액은 "$" 날짜는 DD-MON-YY 형식이고
한글 방식은 :금액은"//" (원) 표시 날짜는 YYYY-MM-DD 형식으로 보여준다
NLS_CHARACTERSET :데이블명 컬럼명을 한글로 사용할수있다 컬럼의 데이터는 정의 된 값과 상관없이
한글입력이 가능하다 '
Client 언어 설정
Unix
%vi .cshrc
...........
setenv nls_lang korea_korea.ko16ksc5601
..........
:wq!
% source .cshrc
Windows
실행->regedit->LOCAL_MACHINE->SOFTWARE-ORACLE 선택 한 내용이다
가능하면 한국에서 는 아래처럼 CLIENT 설정은 변경하지 않는다
일반적으로 서버의 설정을 변경한다
아니면 프로그램에서 변경처리한다
public static String toKorean(String str) {
String convStr = null;
try {
if(str == null)
return "";
// 현재문자열을 8859_1형식으로 읽어내어 KSC5601형식으로 변환
convStr = new String(str.getBytes("8859_1"),"KSC5601");
} catch (UnsupportedEncodingException e) {
}
return convStr;
}