행위

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

DB CAFE

(새 문서: Oracle DataBase 문자셋과 언어셋 확인 및 변경하기 A db에서 export 한 것을 B db로 import 하려니 한글이 들어있는 칼럼의 경우에 사이즈가 맞지 않...)
 
7번째 줄: 7번째 줄:
 
잘 정리된 글을 보고 따라했기에 그 글을 올린다.
 
잘 정리된 글을 보고 따라했기에 그 글을 올린다.
  
Oracle DataBase 문자셋과 언어셋 확인 및 변경하기Oracle DataBase 문자셋과 언어셋 확인하기
+
== Oracle DataBase 문자셋과 언어셋 확인 및 변경 ==
 
 
 
   
 
   
[ 문자셋 확인 ]
+
=== 문자셋 확인 ===
 +
<source lang=sql>
 
SELECT name, value$
 
SELECT name, value$
FROM sys.props$
+
  FROM sys.props$
WHERE name = 'NLS_CHARACTERSET';
+
WHERE name in('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
 +
</source>
  
SELECT name, value$
+
=== 문자셋 변경 ===
FROM sys.props$
 
WHERE name = 'NLS_NCHAR_CHARACTERSET';
 
  
[ 언어셋 확인 ]
+
* Oracle DataBase 관리자로 접속 NLS_CHARACTERSET, NCHAR의 CHARACTERSET에 원하는 문자셋을 변경
SELECT name, value$
 
FROM sys.props$
 
WHERE name = 'NLS_LANGUAGE';
 
  
Oracle DataBase 문자셋과 언어셋 변경하기
+
<source lang=sql>
 +
UPDATE sys.props$
 +
  SET value$ = '[ 변경을 원하는 문자셋 (KO16KSC5601, AL32UTF8 등)]'
 +
WHERE name = 'NLS_CHARACTERSET';
 +
</source>
  
+
<source lang=sql>
- 문자셋 변경 : Oracle DataBase 관리자로 접속하여 NLS_CHARACTERSET, NCHAR의 CHARACTERSET에 원하는 문자셋을 변경할 수 있다.
+
UPDATE sys.props$
- 언어셋 변경 : 문자셋과 마찬가지로 오라클 데이터베이스 관리자로 접속하여 NLS_LANGUAGE에 원하는 언어셋을 변경할 수 있다.
+
  SET value$ = '[ 변경을 원하는 문자셋 (KO16KSC5601, AL32UTF8 등)]'
 +
WHERE name = 'NLS_NCHAR_CHARACTERSET';
 +
</source>
  
[ 문자셋 변경 ]
+
=== 언어셋 확인 ===
UPDATE sys.props$
+
<source lang=sql>
SET value$ = '[ 변경을 원하는 문자셋 (KO16KSC5601, AL32UTF8 등)]'
+
SELECT name, value$
WHERE name = 'NLS_CHARACTERSET';
+
  FROM sys.props$
 +
WHERE name = 'NLS_LANGUAGE'; -- AMERICAN , KOREAN
 +
</source>
  
 +
=== 언어셋 변경 ===
 +
* 오라클 데이터베이스 관리자로 접속하여 NLS_LANGUAGE에 원하는 언어셋을 변경
 +
<source lang=sql>
 
UPDATE sys.props$
 
UPDATE sys.props$
SET value$ = '[ 변경을 원하는 문자셋 (KO16KSC5601, AL32UTF8 등)]'
+
  SET value$ = '[ 변경을 원하는 문자셋 (AMERICAN_AMERICA.KO16KSC5601, AMERICAN_AMERICA.AL32UTF8등)]'
WHERE name = 'NLS_NCHAR_CHARACTERSET';
+
WHERE name = 'NLS_LANGUAGE'';
 +
</source>
  
[ 언어셋 변경 ]
+
<source lang=shell>
UPDATE sys.props$
 
SET value$ = '[ 변경을 원하는 문자셋 (AMERICAN_AMERICA.KO16KSC5601, AMERICAN_AMERICA.AL32UTF8등)]'
 
WHERE name = 'NLS_LANGUAGE'';
 
출처 : Tong - 시우세상님의 Oracle통
 
Oracle Character set 변경 자세히...............
 
 
####################################################
 
####################################################
 
#### .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번째 줄: 61번째 줄:
 
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번째 줄: 77번째 줄:
 
update props$ set VALUE$='KOREA' where name='NLS_TERRITORY';
 
update props$ set VALUE$='KOREA' where name='NLS_TERRITORY';
  
 +
</source>
  
  
####################################################
+
== 캐릭터셋 확인 쿼리 ==
#### 캐릭터 셋 변경후에 확인 사항(필수)
 
 
 
에러 유형 :
 
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 이 섞여있음.
 
 
 
 
 
  
캐릭터셋 확인 쿼리 :
+
<source lang=sql>
select distinct(nls_charset_name(charsetid)) CHARACTERSET,
+
select distinct(nls_charset_name(charsetid)) CHARACTERSET,decode(type#, 1, decode(charsetform, 1, 'VARCHAR2', 2, 'NVARCHAR2','UNKOWN'),
decode(type#, 1, decode(charsetform, 1, 'VARCHAR2', 2, 'NVARCHAR2','UNKOWN'),
 
 
9, decode(charsetform, 1, 'VARCHAR', 2, 'NCHAR VARYING', 'UNKOWN'),
 
9, decode(charsetform, 1, 'VARCHAR', 2, 'NCHAR VARYING', 'UNKOWN'),
 
96, decode(charsetform, 1, 'CHAR', 2, 'NCHAR', 'UNKOWN'),
 
96, decode(charsetform, 1, 'CHAR', 2, 'NCHAR', 'UNKOWN'),
 
112, decode(charsetform, 1, 'CLOB', 2, 'NCLOB', 'UNKOWN')) TYPES_USED_IN
 
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);
+
  from sys.col$  
 +
where charsetform in (1,2) and type# in (1, 9, 96, 112);
 +
</source>
  
캐릭터셋 확인 쿼리 결과(잘못된 경우): varchar2가 2개 의 캐릭터셋이 설정되어있음.
+
 
 +
=== 캐릭터셋 확인 쿼리 결과(잘못된 경우): ===
 +
* varchar2가 2개 의 캐릭터셋이 설정되어있음.
 +
<source lang=sql>
 
CHARACTERSET TYPES_USED_IN
 
CHARACTERSET TYPES_USED_IN
 
-----------------------------------------------------
 
-----------------------------------------------------
117번째 줄: 104번째 줄:
 
WE8DEC VARCHAR2
 
WE8DEC VARCHAR2
 
US7ASCII CLOB
 
US7ASCII CLOB
 +
</source>
  
 +
=== 캐릭터셋 확인 쿼리 결과(정상인 경우): ===
 +
* TYPES_USERD_IN 하나당 하나의 캐릭터셋
 +
<source lang=sql>
  
캐릭터셋 확인 쿼리 결과(정상인 경우): TYPES_USERD_IN 하나당 하나의 캐릭터셋
 
 
CHARACTERSET TYPES_USED_IN
 
CHARACTERSET TYPES_USED_IN
 
-----------------------------------------------------
 
-----------------------------------------------------
128번째 줄: 118번째 줄:
 
AL32UTF8 VARCHAR2
 
AL32UTF8 VARCHAR2
 
AL32UTF8 CLOB
 
AL32UTF8 CLOB
 +
</source>
  
 
+
=== 해결 방법 : ===
해결 방법 :  
 
  
 
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
 +
</source>
  
 
2. sqlplus "/as sysdba"로 다음 쿼리 실행(기존 데이터 백업 필수)
 
2. sqlplus "/as sysdba"로 다음 쿼리 실행(기존 데이터 백업 필수)
 +
<source lang=sql>
 
SHUTDOWN IMMEDIATE;
 
SHUTDOWN IMMEDIATE;
 
STARTUP MOUNT;
 
STARTUP MOUNT;
146번째 줄: 139번째 줄:
 
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>
 
-- 한글로 바꿀 경우(선택)
 
-- 한글로 바꿀 경우(선택)
 +
<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 수정한 경우 원복.

2019년 8월 5일 (월) 11:00 판

thumb_up 추천메뉴 바로가기


Oracle DataBase 문자셋과 언어셋 확인 및 변경하기 A db에서 export 한 것을 B db로 import 하려니 한글이 들어있는 칼럼의 경우에 사이즈가 맞지 않다고 나온다. 디비에 대해서 전혀 고려하지 않고 내리고 올리려고 했던터라 혹시나해서 보니 역시나 디비의 캐릭터가 다르더라.

그나저나 이 경우에는 기존에 데이터가 없어서 그냥 바꿔도 괜찮더라.

잘 정리된 글을 보고 따라했기에 그 글을 올린다.

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

1.1 문자셋 확인[편집]

SELECT name, value$
  FROM sys.props$
 WHERE name in('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');

1.2 문자셋 변경[편집]

  • 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.3 언어셋 확인[편집]

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

1.4 언어셋 변경[편집]

  • 오라클 데이터베이스 관리자로 접속하여 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';


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);


2.1 캐릭터셋 확인 쿼리 결과(잘못된 경우):[편집]

  • varchar2가 2개 의 캐릭터셋이 설정되어있음.
CHARACTERSET TYPES_USED_IN
-----------------------------------------------------
AL16UTF16 NCHAR
AL16UTF16 NVARCHAR2
AL16UTF16 NCLOB
US7ASCII CHAR
US7ASCII VARCHAR2
WE8DEC VARCHAR2
US7ASCII CLOB

2.2 캐릭터셋 확인 쿼리 결과(정상인 경우):[편집]

  • TYPES_USERD_IN 하나당 하나의 캐릭터셋
CHARACTERSET TYPES_USED_IN
-----------------------------------------------------
AL16UTF16 NCHAR
AL16UTF16 NVARCHAR2
AL16UTF16 NCLOB
AL32UTF8 CHAR
AL32UTF8 VARCHAR2
AL32UTF8 CLOB

2.3 해결 방법 :[편집]

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

SQL>show parameter parallel_server

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;

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

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 수정한 경우 원복.