행위

"Oracle 언어설정"의 두 판 사이의 차이

DB CAFE

(새 문서: Oracle DataBase 문자셋과 언어셋 확인 및 변경하기 A db에서 export 한 것을 B db로 import 하려니 한글이 들어있는 칼럼의 경우에 사이즈가 맞지 않...)
 
(문자셋 변경(SERVER))
 
(사용자 2명의 중간 판 43개는 보이지 않습니다)
1번째 줄: 1번째 줄:
Oracle DataBase 문자셋과 언어셋 확인 및 변경하기
+
== Oracle DataBase 문자셋과 언어셋 확인 및 변경 ==
A db에서 export 한 것을 B db로 import 하려니 한글이 들어있는 칼럼의 경우에 사이즈가 맞지 않다고 나온다.
+
=== 개요 ===
디비에 대해서 전혀 고려하지 않고 내리고 올리려고 했던터라 혹시나해서 보니 역시나 디비의 캐릭터가 다르더라.
+
==== NLS_LANG ====
 +
{{틀:타이틀 투명
 +
|보더색=#696969
 +
|배경색=#483d8b
 +
|제목= - NLS_LANG =  [언어]_[영역].[캐릭터셋]
 +
            <language>_<Territory>.<client characterset>
 +
    ex) AMERICAN_ARERICA.KO16KSC5601, AMERICAN_AMRRICA.UTF8
 +
}}
 +
==== NLS_LANG 설명 ====
  
그나저나 이 경우에는 기존에 데이터가 없어서 그냥 바꿔도 괜찮더라.
+
  ● <Territory> - (국가) 영역정보, 달력 설정 방법, 통화기호(달라), 숫자그룹
 +
                  날짜 포맷(한국 - "05/08/12 오후 07:28:03", 체코 - "10.08.05 19:28:03")
 +
                  Language 값만 설정하면, Language 값을 따른다. ( AMERICAN ==> AMERICA )
  
잘 정리된 글을 보고 따라했기에 그 글을 올린다.
+
  ● <language> - 캐릭터셋, 정렬방식, 날짜 표기에 사용되는 기호(년/월/일, YYYY/MM/DD)
 +
                  Default 값은 AMERICAN 이다.
 +
                  실제 날짜 표기(TO_CHAR,TO_DATE 실행시 - 월요일, MON 으로 표시를 좌우하는
 +
                  NLS_DATE_FORMAT 값은 NLS_LANGUAGE 을 따른다.
  
Oracle DataBase 문자셋과 언어셋 확인 및 변경하기Oracle DataBase 문자셋과 언어셋 확인하기
+
  ● <client characterset>
 +
    ◇ 기본적으로 Server characterset 과 동일하게 설정된다.
 +
    - 클라이언트에서 캐릭터셋만 설정하면, 디폴트로 AMERICAN_AMERICA 로 Territory_language 값이 설정된다.
 +
 
 +
    ◇ Client Characterset 을 Server 와 다르게 설정 상태에서,
 +
      SQL> SELECT SYS_CONTEXT('USERENV','LANGUAGE') "NLS SET" from dual;
 +
      을 실행 하여도, 항상 CharacterSet 은 항상 서버 CharacterSet 값을 가져온다.
 +
 
 +
    ◇ client characterset을 서버와 다르게 하는 경우는 크게
 +
 
 +
      1. 다른 캐릭터셋 DB로 데이타 이전시(EXPORT/IMPORT)
 +
        △  EXPORT/IMPORT 시에는 반드시 서버의 Character Set 동일하게 설정 후 Export/Import 한다.
 +
        △  다른 캐릭터셋의 DB(데이타가 깨지지 않고, 지원되는 경우, SubSet Characterset 일경우)로 IMPORT 시에는
 +
          Import 대상의 DB 캐릭터셋으로 환경 설정 후, Export/Import 한다.
 +
 
 +
      2. Server(UTF8) - Client(KO16KSC5601)
 +
        △ 다국어 지원되는 데이타베이스에다 한글 입출력 하기 위해서는
 +
            입력시 - 내가 입력 하는 데이타의 캐릭터셋이 한글임을 알리기 위해서,
 +
            출력시 - Unicode 의 Data를 한글로 표현해 달라고 하기 위해서.
  
 
   
 
   
[ 문자셋 확인 ]
+
=== 문자셋 확인 ===
SELECT name, value$
+
<source lang=sql>
FROM sys.props$
+
-- NLS_LANG 조회       
WHERE name = 'NLS_CHARACTERSET';
+
SELECT (SELECT value
 +
        FROM  nls_database_parameters
 +
        WHERE  parameter = 'NLS_LANGUAGE')
 +
      || '_'
 +
      || (SELECT value
 +
          FROM  nls_database_parameters
 +
          WHERE  parameter = 'NLS_TERRITORY')
 +
      || '.'
 +
      || (SELECT value
 +
          FROM  nls_database_parameters
 +
          WHERE  parameter = 'NLS_CHARACTERSET') NLS_LANG
 +
FROM  dual       
 +
</source>
 +
 
 +
<source lang=sql>
 +
-- NLS_LANGUAGE/ NLS_CHARACTERSET / NLS_NCHAR_CHARACTERSET
 +
SELECT name
 +
    , value$
 +
  FROM sys.props$
 +
WHERE name in('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
  
SELECT name, value$
+
</source>
FROM sys.props$
 
WHERE name = 'NLS_NCHAR_CHARACTERSET';
 
  
[ 언어셋 확인 ]
+
=== CHAR 와 NCHAR 캐릭터 셋  ===
SELECT name, value$
+
# NLS_CHARACTERSET : char, varchar 데이터 타입에서 사용하는 문자 집합
FROM sys.props$
+
# NLS_NCHAR_CHARACTERSET  : nchar, nvarchar 데이터 타입에서 사용하는 문자 집합
WHERE name = 'NLS_LANGUAGE';
 
  
Oracle DataBase 문자셋과 언어셋 변경하기
+
=== 문자셋 변경(SERVER) ===
  
+
* Oracle DataBase 관리자로 접속 NLS_CHARACTERSET, NCHAR의 CHARACTERSET에 원하는 문자셋을 변경
- 문자셋 변경 : Oracle DataBase 관리자로 접속하여 NLS_CHARACTERSET, NCHAR의 CHARACTERSET에 원하는 문자셋을 변경할 수 있다.
 
- 언어셋 변경 : 문자셋과 마찬가지로 오라클 데이터베이스 관리자로 접속하여 NLS_LANGUAGE에 원하는 언어셋을 변경할 수 있다.
 
  
[ 문자셋 변경 ]
+
<source lang=sql>
 
UPDATE sys.props$
 
UPDATE sys.props$
SET value$ = '[ 변경을 원하는 문자셋 (KO16KSC5601, AL32UTF8 등)]'
+
  SET value$ = '[ 변경을 원하는 문자셋 (KO16KSC5601, AL32UTF8 등)]'
WHERE name = 'NLS_CHARACTERSET';
+
WHERE name = 'NLS_CHARACTERSET';
 +
</source>
  
 +
<source lang=sql>
 
UPDATE sys.props$
 
UPDATE sys.props$
SET value$ = '[ 변경을 원하는 문자셋 (KO16KSC5601, AL32UTF8 등)]'
+
  SET value$ = '[ 변경을 원하는 문자셋 (KO16KSC5601, AL32UTF8 등)]'
WHERE name = 'NLS_NCHAR_CHARACTERSET';
+
WHERE name = 'NLS_NCHAR_CHARACTERSET';
 +
</source>
 +
 
 +
=== 언어셋 확인 ===
 +
<source lang=sql>
 +
SELECT name, value$
 +
  FROM sys.props$
 +
WHERE name = 'NLS_LANGUAGE'; -- AMERICAN , KOREAN
 +
</source>
  
[ 언어셋 변경 ]
+
=== 언어셋 변경(SERVER) ===
 +
* 오라클 데이터베이스 관리자로 접속하여 NLS_LANGUAGE에 원하는 언어셋을 변경
 +
<source lang=sql>
 
UPDATE sys.props$
 
UPDATE sys.props$
SET value$ = '[ 변경을 원하는 문자셋 (AMERICAN_AMERICA.KO16KSC5601, AMERICAN_AMERICA.AL32UTF8등)]'
+
  SET value$ = '[ 변경을 원하는 문자셋 (AMERICAN_AMERICA.KO16KSC5601, AMERICAN_AMERICA.AL32UTF8등)]'
WHERE name = 'NLS_LANGUAGE'';
+
WHERE name = 'NLS_LANGUAGE'';
출처 : Tong - 시우세상님의 Oracle통
+
</source>
Oracle Character set 변경 자세히...............
+
 
 +
<source lang=shell>
 
####################################################
 
####################################################
 
#### .bash_profile 환경변수
 
#### .bash_profile 환경변수
 +
 
export ORACLE_BASE=/home/oracle
 
export ORACLE_BASE=/home/oracle
 
export ORACLE_HOME=$ORACLE_BASE/oracle/product/10.2.0/db_1
 
export ORACLE_HOME=$ORACLE_BASE/oracle/product/10.2.0/db_1
57번째 줄: 116번째 줄:
 
export NLS_LANG=KOREAN_KOREA.KO16MSWIN949 #한글(추천:지원캐릭터가 더 많음 -뷃,숖..)
 
export NLS_LANG=KOREAN_KOREA.KO16MSWIN949 #한글(추천:지원캐릭터가 더 많음 -뷃,숖..)
 
export NLS_LANG=AMERICAN_AMERICA.UTF8 #유니코드
 
export NLS_LANG=AMERICAN_AMERICA.UTF8 #유니코드
 
 
 
 
####################################################
 
####################################################
 
#### 캐릭터 셋 설정 확인
 
#### 캐릭터 셋 설정 확인
76번째 줄: 132번째 줄:
 
update props$ set VALUE$='KOREA' where name='NLS_TERRITORY';
 
update props$ set VALUE$='KOREA' where name='NLS_TERRITORY';
  
 +
</source>
  
 
+
=== 언어셋 RAC 환경 에서 변경하기 KSC5601 -> KO16MSWIN949 이나 UTF-8  ===
####################################################
+
==== 언어 변경 절차 ====
#### 캐릭터 셋 변경후에 확인 사항(필수)
 
 
 
에러 유형 :
 
EXP-00008: ORACLE 오류 6552가 발생했습니다
 
ORA-06552: PL/SQL: Compilation unit analysis terminated
 
ORA-06553: PLS-553: 알 수 없는 문자 집합 이름입니다
 
 
 
 
 
Problem description
 
===================
 
You receive the following error when (re)compiling or calling a piece of pl/sql:
 
ORA-06550: line <num>, column <num>: ....
 
or
 
ORA-06552: PL/SQL: Compilation unit analysis terminated
 
followed by
 
ORA-06553: PLS-553: character set name is not recognized
 
에러 원인 : character set 이 섞여있음.
 
 
 
 
 
 
 
캐릭터셋 확인 쿼리 :
 
select distinct(nls_charset_name(charsetid)) CHARACTERSET,
 
decode(type#, 1, decode(charsetform, 1, 'VARCHAR2', 2, 'NVARCHAR2','UNKOWN'),
 
9, decode(charsetform, 1, 'VARCHAR', 2, 'NCHAR VARYING', 'UNKOWN'),
 
96, decode(charsetform, 1, 'CHAR', 2, 'NCHAR', 'UNKOWN'),
 
112, decode(charsetform, 1, 'CLOB', 2, 'NCLOB', 'UNKOWN')) TYPES_USED_IN
 
from sys.col$ where charsetform in (1,2) and type# in (1, 9, 96, 112);
 
 
 
캐릭터셋 확인 쿼리 결과(잘못된 경우): varchar2가 2개 의 캐릭터셋이 설정되어있음.
 
CHARACTERSET TYPES_USED_IN
 
-----------------------------------------------------
 
AL16UTF16 NCHAR
 
AL16UTF16 NVARCHAR2
 
AL16UTF16 NCLOB
 
US7ASCII CHAR
 
US7ASCII VARCHAR2
 
WE8DEC VARCHAR2
 
US7ASCII CLOB
 
 
 
 
 
캐릭터셋 확인 쿼리 결과(정상인 경우): TYPES_USERD_IN 하나당 하나의 캐릭터셋
 
CHARACTERSET TYPES_USED_IN
 
-----------------------------------------------------
 
AL16UTF16 NCHAR
 
AL16UTF16 NVARCHAR2
 
AL16UTF16 NCLOB
 
AL32UTF8 CHAR
 
AL32UTF8 VARCHAR2
 
AL32UTF8 CLOB
 
 
 
 
 
해결 방법 :
 
  
 
1. INIT.ORA 안에 있는 parallel_server parameter 가 false 거나 아예 세팅되어있지 않은지 확인.
 
1. INIT.ORA 안에 있는 parallel_server parameter 가 false 거나 아예 세팅되어있지 않은지 확인.
 +
<source lang=sql>
 
SQL>show parameter parallel_server
 
SQL>show parameter parallel_server
 +
--  RAC 인 경우 클러스터 사용 중지
 +
SQL>alter system set cluster_database=false scope=spfile;
 +
</source>
  
 
2. sqlplus "/as sysdba"로 다음 쿼리 실행(기존 데이터 백업 필수)
 
2. sqlplus "/as sysdba"로 다음 쿼리 실행(기존 데이터 백업 필수)
 +
<source lang=sql>
 
SHUTDOWN IMMEDIATE;
 
SHUTDOWN IMMEDIATE;
 
STARTUP MOUNT;
 
STARTUP MOUNT;
146번째 줄: 156번째 줄:
 
COL VALUE NEW_VALUE NCHARSET
 
COL VALUE NEW_VALUE NCHARSET
 
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET';
 
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET';
 
+
</source>
 
-- UTF8로 바꿀 경우(선택)
 
-- UTF8로 바꿀 경우(선택)
 +
<source lang=sql>
 
ALTER DATABASE CHARACTER SET INTERNAL_USE UTF8;
 
ALTER DATABASE CHARACTER SET INTERNAL_USE UTF8;
 
ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL16UTF16;
 
ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL16UTF16;
 
+
</source>
-- 한글로 바꿀 경우(선택)
+
-- 한글 KO16MSWIN949 로 바꿀 경우(선택)
 +
<source lang=sql>
 
ALTER DATABASE CHARACTER SET INTERNAL_USE KO16MSWIN949
 
ALTER DATABASE CHARACTER SET INTERNAL_USE KO16MSWIN949
 
ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL16UTF16;
 
ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL16UTF16;
 
+
</source>
 
-- oracle reboot 2번.
 
-- oracle reboot 2번.
 +
<source lang=sql>
 
SHUTDOWN IMMEDIATE;
 
SHUTDOWN IMMEDIATE;
 
STARTUP;
 
STARTUP;
 
SHUTDOWN IMMEDIATE;
 
SHUTDOWN IMMEDIATE;
 
STARTUP;
 
STARTUP;
 +
</source>
  
 
3. parallel_server parameter 수정한 경우 원복.
 
3. parallel_server parameter 수정한 경우 원복.
 +
<source lang=sql>
 +
--  RAC 클러스터 사용 중지
 +
SQL>alter system set cluster_database=true scope=spfile;
 +
-- 확인
 +
SQL>show parameter parallel_server
 +
</source>
 +
 +
==== 서버 기동 후 캐릭셋 확인  ====
 +
<source lang=sql>
 +
-- 캐릭터셋 확인
 +
SELECT DISTINCT(NLS_CHARSET_NAME(CHARSETID)) CHARACTERSET
 +
    , DECODE(TYPE#, 1 , DECODE(CHARSETFORM, 1,'VARCHAR2', 2,'NVARCHAR2','UNKOWN')
 +
                  , 9  , DECODE(CHARSETFORM, 1,'VARCHAR' , 2,'NCHAR VARYING','UNKOWN')
 +
                  , 96 , DECODE(CHARSETFORM, 1,'CHAR'    , 2,'NCHAR','UNKOWN')
 +
                  , 112, DECODE(CHARSETFORM, 1,'CLOB'    , 2,'NCLOB','UNKOWN')
 +
            ) TYPES_USED_IN
 +
  FROM SYS.COL$
 +
WHERE CHARSETFORM IN (1,2)
 +
  AND TYPE# IN (1, 9, 96, 112);
 +
 +
-- 기존
 +
CHARACTERSET                            TYPES_USED_IN
 +
---------------------------------------- -------------
 +
AL16UTF16                                NCLOB
 +
KO16KSC5601                              CLOB
 +
AL16UTF16                                NCHAR
 +
AL16UTF16                                NVARCHAR2
 +
KO16KSC5601                              CHAR
 +
KO16KSC5601                              VARCHAR2
 +
 +
 +
-- 1호기,2호기 확인
 +
CHARACTERSET                            TYPES_USED_IN
 +
---------------------------------------- -------------
 +
AL16UTF16                                NCLOB
 +
KO16MSWIN949                            CHAR
 +
KO16MSWIN949                            VARCHAR2
 +
KO16MSWIN949                            CLOB
 +
AL16UTF16                                NCHAR
 +
AL16UTF16                                NVARCHAR2
 +
</source>
 +
 +
=== DB 이관시 한글이 서로 맞지 않을때 ===
 +
 +
예시) 소스DB : US7ASCII  >>>> 타겟DB : KO16MSWIN949
 +
 +
{{틀:타이틀 투명
 +
|보더색=#696969
 +
|배경색=#483d8b
 +
|제목= 예시) 소스DB : US7ASCII  >>>> 타겟DB : KO16MSWIN949
 +
# 소스DB의 한글 컬럼 UTL_RAW.CAST_TO_RAW 함수로 감싸고 (주로 뷰를 생성)
 +
# 타겟DB에서 RAW.CAST_TO_VARCHAR2 함수로 풀어서 사용.
 +
}}
 +
* UTL_RAW.CAST_TO_RAW  /* 한글을 16진수 핵사 코드로 변환 */
 +
* RAW.CAST_TO_VARCHAR2 /* 16진수 핵사 한글로 변환 */
 +
 +
<source lang=sql>
 +
select '홍길동', UTL_RAW.CAST_TO_RAW('홍길동') from TB_XXX;
 +
select UTL_RAW.CAST_TO_VARCHAR2('C8ABB1E6B5BF') from TB_YYY;
 +
</source>
 +
 +
=== 참조 URL ===
 +
# US7ASCII 캐릭터셋 변경 https://javafactory.tistory.com/242
 +
 +
 +
[[Category:oracle]]

2024년 4월 22일 (월) 14:17 기준 최신판

thumb_up 추천메뉴 바로가기


1 Oracle DataBase 문자셋과 언어셋 확인 및 변경[편집]

1.1 개요[편집]

1.1.1 NLS_LANG[편집]

 attach_file - NLS_LANG = [언어]_[영역].[캐릭터셋]

            <language>_<Territory>.<client characterset>
   ex) AMERICAN_ARERICA.KO16KSC5601, AMERICAN_AMRRICA.UTF8

1.1.2 NLS_LANG 설명[편집]

 ● <Territory> - (국가) 영역정보, 달력 설정 방법, 통화기호(달라), 숫자그룹
                  날짜 포맷(한국 - "05/08/12 오후 07:28:03", 체코 - "10.08.05 19:28:03")
                  Language 값만 설정하면, Language 값을 따른다. ( AMERICAN ==> AMERICA )
 ● <language> - 캐릭터셋, 정렬방식, 날짜 표기에 사용되는 기호(년/월/일, YYYY/MM/DD) 
                 Default 값은 AMERICAN 이다.
                 실제 날짜 표기(TO_CHAR,TO_DATE 실행시 - 월요일, MON 으로 표시를 좌우하는
                 NLS_DATE_FORMAT 값은 NLS_LANGUAGE 을 따른다.
 ● <client characterset>
   ◇ 기본적으로 Server characterset 과 동일하게 설정된다.
   - 클라이언트에서 캐릭터셋만 설정하면, 디폴트로 AMERICAN_AMERICA 로 Territory_language 값이 설정된다.
   ◇ Client Characterset 을 Server 와 다르게 설정 상태에서,
     SQL> SELECT SYS_CONTEXT('USERENV','LANGUAGE') "NLS SET" from dual;
     을 실행 하여도, 항상 CharacterSet 은 항상 서버 CharacterSet 값을 가져온다.
   ◇ client characterset을 서버와 다르게 하는 경우는 크게
     1. 다른 캐릭터셋 DB로 데이타 이전시(EXPORT/IMPORT)
        △  EXPORT/IMPORT 시에는 반드시 서버의 Character Set 동일하게 설정 후 Export/Import 한다.
        △  다른 캐릭터셋의 DB(데이타가 깨지지 않고, 지원되는 경우, SubSet Characterset 일경우)로 IMPORT 시에는
          Import 대상의 DB 캐릭터셋으로 환경 설정 후, Export/Import 한다.
     2. Server(UTF8) - Client(KO16KSC5601)
        △ 다국어 지원되는 데이타베이스에다 한글 입출력 하기 위해서는
           입력시 - 내가 입력 하는 데이타의 캐릭터셋이 한글임을 알리기 위해서,
           출력시 - Unicode 의 Data를 한글로 표현해 달라고 하기 위해서.


1.2 문자셋 확인[편집]

-- NLS_LANG 조회         
SELECT (SELECT value 
        FROM   nls_database_parameters 
        WHERE  parameter = 'NLS_LANGUAGE') 
       || '_' 
       || (SELECT value 
           FROM   nls_database_parameters 
           WHERE  parameter = 'NLS_TERRITORY') 
       || '.' 
       || (SELECT value 
           FROM   nls_database_parameters 
           WHERE  parameter = 'NLS_CHARACTERSET') NLS_LANG 
FROM   dual
-- NLS_LANGUAGE/ NLS_CHARACTERSET / NLS_NCHAR_CHARACTERSET
SELECT name
     , value$
  FROM sys.props$
 WHERE name in('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');

1.3 CHAR 와 NCHAR 캐릭터 셋[편집]

  1. NLS_CHARACTERSET : char, varchar 데이터 타입에서 사용하는 문자 집합
  2. NLS_NCHAR_CHARACTERSET  : nchar, nvarchar 데이터 타입에서 사용하는 문자 집합

1.4 문자셋 변경(SERVER)[편집]

  • Oracle DataBase 관리자로 접속 NLS_CHARACTERSET, NCHAR의 CHARACTERSET에 원하는 문자셋을 변경
UPDATE sys.props$
   SET value$ = '[ 변경을 원하는 문자셋 (KO16KSC5601, AL32UTF8 등)]'
 WHERE name = 'NLS_CHARACTERSET';
UPDATE sys.props$
   SET value$ = '[ 변경을 원하는 문자셋 (KO16KSC5601, AL32UTF8 등)]'
 WHERE name = 'NLS_NCHAR_CHARACTERSET';

1.5 언어셋 확인[편집]

SELECT name, value$
  FROM sys.props$
 WHERE name = 'NLS_LANGUAGE'; -- AMERICAN , KOREAN

1.6 언어셋 변경(SERVER)[편집]

  • 오라클 데이터베이스 관리자로 접속하여 NLS_LANGUAGE에 원하는 언어셋을 변경
UPDATE sys.props$
   SET value$ = '[ 변경을 원하는 문자셋 (AMERICAN_AMERICA.KO16KSC5601, AMERICAN_AMERICA.AL32UTF8등)]'
 WHERE name = 'NLS_LANGUAGE'';
####################################################
#### .bash_profile 환경변수

export ORACLE_BASE=/home/oracle
export ORACLE_HOME=$ORACLE_BASE/oracle/product/10.2.0/db_1
export ORACLE_SID=ora10
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
#export LD_ASSUME_KERNEL=2.4.19
export PATH=$PATH:$ORACLE_HOME/bin

export NLS_LANG=KOREAN_KOREA.KO16KSC5601 #한글
export NLS_LANG=KOREAN_KOREA.KO16MSWIN949 #한글(추천:지원캐릭터가 더 많음 -뷃,숖..)
export NLS_LANG=AMERICAN_AMERICA.UTF8 #유니코드
####################################################
#### 캐릭터 셋 설정 확인

SELECT NAME,VALUE$ FROM PROPS$ WHERE NAME ='NLS_LANGUAGE' OR NAME ='NLS_TERRITORY' OR NAME ='NLS_CHARACTERSET';


####################################################
#### 오라클 캐릭터 셋 변경

update props$ set VALUE$='UTF-8' where name='NLS_CHARACTERSET';
update props$ set VALUE$='KO16MSWIN949' where name='NLS_CHARACTERSET';
update props$ set VALUE$='KO16KSC5601' where name='NLS_CHARACTERSET';

update props$ set VALUE$='KOREAN' where name='NLS_LANGUAGE';
update props$ set VALUE$='KOREA' where name='NLS_TERRITORY';

1.7 언어셋 RAC 환경 에서 변경하기 KSC5601 -> KO16MSWIN949 이나 UTF-8[편집]

1.7.1 언어 변경 절차[편집]

1. INIT.ORA 안에 있는 parallel_server parameter 가 false 거나 아예 세팅되어있지 않은지 확인.

SQL>show parameter parallel_server
--  RAC 인 경우 클러스터 사용 중지 
SQL>alter system set cluster_database=false scope=spfile;

2. sqlplus "/as sysdba"로 다음 쿼리 실행(기존 데이터 백업 필수)

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
COL VALUE NEW_VALUE CHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
COL VALUE NEW_VALUE NCHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET';

-- UTF8로 바꿀 경우(선택)

ALTER DATABASE CHARACTER SET INTERNAL_USE UTF8;
ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL16UTF16;

-- 한글 KO16MSWIN949 로 바꿀 경우(선택)

ALTER DATABASE CHARACTER SET INTERNAL_USE KO16MSWIN949
ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL16UTF16;

-- oracle reboot 2번.

SHUTDOWN IMMEDIATE;
STARTUP;
SHUTDOWN IMMEDIATE;
STARTUP;

3. parallel_server parameter 수정한 경우 원복.

--  RAC 클러스터 사용 중지 
SQL>alter system set cluster_database=true scope=spfile;
-- 확인 
SQL>show parameter parallel_server

1.7.2 서버 기동 후 캐릭셋 확인[편집]

-- 캐릭터셋 확인 
SELECT DISTINCT(NLS_CHARSET_NAME(CHARSETID)) CHARACTERSET
     , DECODE(TYPE#, 1 , DECODE(CHARSETFORM, 1,'VARCHAR2', 2,'NVARCHAR2','UNKOWN')
                  , 9  , DECODE(CHARSETFORM, 1,'VARCHAR' , 2,'NCHAR VARYING','UNKOWN')
                  , 96 , DECODE(CHARSETFORM, 1,'CHAR'    , 2,'NCHAR','UNKOWN')
                  , 112, DECODE(CHARSETFORM, 1,'CLOB'    , 2,'NCLOB','UNKOWN')
             ) TYPES_USED_IN 
  FROM SYS.COL$ 
 WHERE CHARSETFORM IN (1,2) 
   AND TYPE# IN (1, 9, 96, 112);

-- 기존 
CHARACTERSET                             TYPES_USED_IN
---------------------------------------- -------------
AL16UTF16                                NCLOB
KO16KSC5601                              CLOB
AL16UTF16                                NCHAR
AL16UTF16                                NVARCHAR2
KO16KSC5601                              CHAR
KO16KSC5601                              VARCHAR2


-- 1호기,2호기 확인 
CHARACTERSET                             TYPES_USED_IN
---------------------------------------- -------------
AL16UTF16                                NCLOB
KO16MSWIN949                             CHAR
KO16MSWIN949                             VARCHAR2
KO16MSWIN949                             CLOB
AL16UTF16                                NCHAR
AL16UTF16                                NVARCHAR2

1.8 DB 이관시 한글이 서로 맞지 않을때[편집]

예시) 소스DB : US7ASCII >>>> 타겟DB : KO16MSWIN949

 attach_file 예시) 소스DB : US7ASCII >>>> 타겟DB : KO16MSWIN949

  1. 소스DB의 한글 컬럼 UTL_RAW.CAST_TO_RAW 함수로 감싸고 (주로 뷰를 생성)
  2. 타겟DB에서 RAW.CAST_TO_VARCHAR2 함수로 풀어서 사용.

  • UTL_RAW.CAST_TO_RAW /* 한글을 16진수 핵사 코드로 변환 */
  • RAW.CAST_TO_VARCHAR2 /* 16진수 핵사 한글로 변환 */
select '홍길동', UTL_RAW.CAST_TO_RAW('홍길동') from TB_XXX;
select UTL_RAW.CAST_TO_VARCHAR2('C8ABB1E6B5BF') from TB_YYY;

1.9 참조 URL[편집]

  1. US7ASCII 캐릭터셋 변경 https://javafactory.tistory.com/242