characterset (2)

### 캐릭터셋 변경전 확인 사항 :

sqlplus '/as sysdba'

sql>select instance from v$thread;

INSTANCE
----------------
ora9i


oracle\ora92\network\admin\snmp_ro.ora 를 봐도 된다.
=> snmp.SID.Oracle = ORACLE




select parameter, value from nls_database_parameters where parameter like '%CHAR%';

PARAMETERVALUE
NLS_NUMERIC_CHARACTERS.,
NLS_CHARACTERSETKO16KSC5601
NLS_NCHAR_CONV_EXCPFALSE
NLS_NCHAR_CHARACTERSETUTF8


########### 캐릭터셋 변경 ##########################

****  connect sys as sysdba;

NLS CHARACTERSET 변경방법 (DB REBUILD 없이)
Bulletin no : 10016

--------------------------------------------------------------------------------

  데이타베이스의  CHARACTER SET은 데이타 딕셔너리 테이블인 sys.props$에
 들어 있다

   SQL>desc sys.props$
   Name                                Null?                  Type
   -------------------------------  -----------------      ---------------
   NAME                               NOT NULL             VARCHAR2(30)
   VALUE$                                                  VARCHAR2(2000)
   COMMENT$                                                VARCHAR2(2000)

   SQL>column c1 format a30
   SQL>select name c1, value$ c1 from sys.props$;

   C1                              C1
   -----------------------------   ------------------------------
   DICT.BASE                        2
   NLS_LANGUAGE                     AMERICAN
   NLS_TERRITORY                    AMERICA
   NLS_CURRENCY                     $
   NLS_ISO_CURRENCY                 AMERICA
   NLS_NUMERIC_CHARACTERS           .,
   NLS_DATE_FORMAT                  DD-MON-YY
   NLS_DATE_LANGUAGE                AMERICAN
   NLS_CHARACTERSET                 US7ASCII
   NLS_SORT                         BINARY
   GLOBAL_DB_NAME                   NLSV7.WORLD
   
  여기서 NLS_CHARACTERSET에 현재 DB의 CHARACTER SET이 들어 있는데 이 값을
 변경하여 DB의 CHARACTER SET을 변경할 수 있다. 여기서는 US7ASCII에서
 KO16KSC5601 로 옮기는 경우를 알아보자.

 우선 바꾸고자 하는 CHRACTER SET이 지원되는 지를 다음 명령으로 확인한다.

         select convert('a','WE8DEC','KO16MSWIN949') from dual; 

  만약 이 Select 문에서 ORA-01482 에러가 발생하면 지정한 CHARACTER SET이
 지원되지 않는  경우이며  에러가 발생하지 않으면 CHARACTER SET을 변경할 수
 있다.
 
  작업을 하기전에는 만약을 위해서 DB 전체를 백업 받아두도록 한다.
  CHARACTER SET 을 잘못 변경하면 DB 를 OPEN 할수가 없기 때문이다.
  ---------------------------------------------------------------

1.  다음의 Update문을 실행하여 CHARACTER SET을 변경한다.

   UPDATE sys.props$
   SET value$ = 'WE8DEC'
   WHERE name = 'NLS_CHARACTERSET';

  Update 시에 NLS_CHARACTERSET을 지원되지 않는 값으로 잘못 설정하거나
 실수로 콘트롤 문자 같은 것이 들어가게 되면 DB가 Shutdown 된 다음에는
 Startup 이 안 되므로 Update 후에 다음 명령으로 확인을 한 다음에  Commit을
 하도록 한다.

        select name, value$
        from sys.props$
        where value$ = 'KO16KSC5601';

 Select   제대로 출력되면 Commit 하고 Shutdown 했다가 Startup 하게 되면
 새로운 CHARACTER SET 값을 갖게 된다. SELECT가 안 되면 ROLLBACK하고 UPDATE
 부터 다시 하도록 한다.

2. 환경 변수 NLS_LANG 을 변경한다.

.profile ( or .cshrc) 에서

NLS_LANG=American_America.KO16KSC5601; export NLS_LANG

or

setenv NLS_LANG American_America.KO16KSC5601






출처 : http://develop.sunshiny.co.kr/201



Oracle 10g Character set 변경(EUC-KR을 UTF8 변경) :
참고

kor 버전으로 받는다면 기본적으로 설치되는 버전은 KO16MSWIN949 일 경우가 많다.
한글을 지원하는 Character Set을 비교해보자.

1. KO16KSC5601
- 한글 지원상태 : 한글 2350자
- 지원버전 : 7.x
- 한글바이트 : 2바이트

2. KO16MSWIN949
- 한글 지원상태 : KO16KSC5601 + 확장 ( 총 11172자 )
- 지원버전 : 8.0.6 이상
- 한글바이트 : 2바이트

3. UTF8
- 한글 지원상태 : 한글 11172자
- 지원버전 : 8.0 이후
- 한글바이트 : 3바이트

4. AL32UTF8
- 한글 지원상태 : 한글 11172자
- 지원버전 : 9i Release 1 이상
- 한글바이트 : 3바이트

UTF8은 많은 문자를 지원하지만 한글을 3바이트 소모한다는 단점이 있다.
(못느낄 정도로 빠른 컴퓨터가 별 차이가 없을 듯함)
캐릭터셋이 어떻게 설정되어 있나 확인 쿼리는 다음과 같다ㅣ

SELECT * FROM sys.props$ where name='NLS_CHARACTERSET';

Oracle 10g Character Set 변경
SQLPLUS 접속후 (system 계정으로 로그인 혹시 모른다면 sqlplus /nolog; 후 conn /as sysdba; 로 접속한다)

C:\>sqlplus /nolog;
sql>conn /as sysdba;
변경하고자하는 캐릭터셋을 수정

sql>update sys.props$ set value$='UTF8' where name='NLS_CHARACTERSET';
sql>update sys.props$ set value$='UTF8' where name='NLS_NCHAR_CHARACTERSET';
sql>
update sys.props$ set value$='KOREAN_KOREA.UTF8' where name='NLS_LANGUAGE';
sql>commit;
sql>shutdown immediate;
sql>startup mount;
sql>alter system enable restricted session;
sql>alter system set job_queue_processes=0;
sql>alter system set aq_tm_processes=0;
sql>alter database open;
sql>alter database character set UTF8;
sql>shutdown immediate;
sql>startup;

출처 : http://www.garubi.com/11