반응형

# 컬럼 문자(char), 바이트(byte) 단위 변경



NLS_LENGTH_SEMANTICS는 바이트(Byte) 또는 문자(Char)길이를 사용하여 char, varchar2 타입의 컬럼을 만들수 있습니다. 
이때 기존의 컬럼은 영향을 받지 않습니다.

NLS_LENGTH_SEMANTICS는 SYS와 SYSTEM의 테이블에 적용되지 않고, 데이터 사전(Data Dictionary)은 항상 바이트 의미 체계를 사용합니다.
그래서 NLS_LENGTH_SEMANTICS를 이용하여 CHAR 단위의 컬럼을 생성해도 데이터 사전에는 실제 바이트로 보여줌


Oracle 9i부터 컬럼의 데이터타입에 Byte 또는 Char를 붙여 단위별 지정 가능
   문자(Char)단위로 변경 하면 설정한 값에 따라 자동으로 Byte 공간을 할당해줍니다.   

> KO16KSC5601
Byte 단위 : 영문/숫자/기호(1Byte), 한글/한자(2Byte)
Char 단위 설정 예) VARCHAR2(100 CHAR) -> VARCHAR2(200)(데이터사전)

> UTF8
Byte 단위 : 영문/숫자/기호(1Byte), 한글/한자(3Byte)
Char 단위 설정 예) VARCHAR2(100 CHAR) -> VARCHAR2(400)(데이터사전)


# NLS_LENGTH_SEMANTICS 설정 방법

1) NLS_LENGTH_SEMANTICS 전역 파라메터 변경 : DBMS 재시작 필요
  > ALTER [SYSTEM|SESSION] SET NLS_LENGTH_SEMANTICS=[CHAR|BYTE]
  
2) 테이블 생성시 지정
  > VARCHAR2(100 CHAR)


> 캐릭터셋 확인

1
2
3
4
5
6
7
8
9
10
SELECT PARAMETER, VALUE
    FROM NLS_DATABASE_PARAMETERS
    WHERE PARAMETER LIKE '%CHAR%';
     
      PARAMETER                      VALUE
------------------------------ --------------------------
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               AL32UTF8
NLS_NCHAR_CONV_EXCP            FALSE
NLS_NCHAR_CHARACTERSET         AL16UTF16


> NLS_LENGTH_SEMANTICS 전역 파라메터 조회

1
2
3
4
5
6
7
8
9
10
11
SELECT *
    FROM NLS_SESSION_PARAMETERS
    WHERE PARAMETER = 'NLS_LENGTH_SEMANTICS'
;
 
-- SQL Plus 에서 파라메터 조회
SQL> SHOW PARAMETER NLS_LENGTH_SEMANTICS
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics                 string      BYTE


> 데이터베이스 전역 NLS_LENGTH_SEMANTICS 변경, char 타입

1
2
3
4
5
6
7
8
SQL> ALTER SYSTEM SET NLS_LENGTH_SEMANTICS=CHAR SCOPE=BOTH ;
 
-- SQL Plus 에서 파라메터 조회
SQL> SHOW PARAMETER NLS_LENGTH_SEMANTICS
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics                 string      CHAR


> DATA_LENGTH, CHAR_USED 타입 조회

1
2
3
4
5
SELECT  COLUMN_ID, OWNER, TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, CHAR_USED
    FROM DBA_TAB_COLUMNS
    WHERE TABLE_NAME ='[테이블명]'
    ORDER BY COLUMN_ID
;


> 테이블 생성및 테스트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
 # CHAR 타입 테이블 생성
*/
CREATE TABLE CHAR_TEST(
    SEQ NUMBER,
    TEXT_SMALL VARCHAR2(100 CHAR),
    TEXT_BIG VARCHAR2(4000 CHAR)
)
 
/*
 # CHAR_TEST 테이블 구조 조회
 > 테이블 구조상에서는 CREATE TABLE시에 설정한 사이즈로 Char 타입 정보 출력
*/
DESC CHAR_TEST;
 
Column Name    ID    Pk    Null?    Data Type   
--------------------------------------------------------
     SEQ         1        Y    NUMBER
   TEXT_SMALL   2        Y    VARCHAR2 (100 Char)
   TEXT_BIG     3        Y    VARCHAR2 (4000 Char)
 
 
/*
 # Data Dictionary 테이블 컬럼별 타입 조회(실제 바이트)
 > 데이터사전에서는 Char 타입에 맞춰서 자동으로 변경된 데이타 길이가 보여짐
   VARCHAR2 타입 최고 길이 4000바이트 안에서 자동 변경
*/
SELECT  COLUMN_ID, OWNER, TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, CHAR_USED
    FROM DBA_TAB_COLUMNS
    WHERE TABLE_NAME ='CHAR_TEST'
    ORDER BY COLUMN_ID
;
 
COLUMN_ID   OWNER   TABLE_NAME   COLUMN_NAME   DATA_TYPE   DATA_LENGTH   CHAR_USED
--------------------------------------------------------------------------------
    1    SUNSHINY    CHAR_TEST    SEQ    NUMBER    22   
    2    SUNSHINY    CHAR_TEST    TEXT_SMALL    VARCHAR2    400    C -- CHAR 타입
    3    SUNSHINY    CHAR_TEST    TEXT_BIG    VARCHAR2    4000    C -- CHAR 타입


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
 # BYTE 타입 테이블 생성
 > 전역 NLS_LENGTH_SEMANTICS 가 BYTE 일경우 기본으로 BYTE 타입 생성
*/
CREATE TABLE BYTE_TEST(
    SEQ NUMBER,
    TEXT_SMALL VARCHAR2(100),
    TEXT_BIG VARCHAR2(4000)
)
 
-- BYTE_TEST 테이블 구조 조회
DESC BYTE_TEST;
 
Column Name    ID    Pk    Null?    Data Type    Default    Histogram    Encryption Alg
------------------------------------------------------------------------------------
    SEQ         1        Y    NUMBER        No       
TEXT_SMALL    2        Y    VARCHAR2 (100 Byte)        No       
TEXT_BIG      3        Y    VARCHAR2 (4000 Byte)        No   
 
-- Dictionary 테이블 컬럼별 타입 조회
SELECT  COLUMN_ID, OWNER, TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, CHAR_USED
    FROM DBA_TAB_COLUMNS
    WHERE TABLE_NAME ='BYTE_TEST'
    ORDER BY COLUMN_ID
;
 
COLUMN_ID    OWNER    TABLE_NAME    COLUMN_NAME    DATA_TYPE    DATA_LENGTH    CHAR_USED
--------------------------------------------------------------------------------
     1    SUNSHINY    BYTE_TEST    SEQ    NUMBER    22   
     2    SUNSHINY    BYTE_TEST    TEXT_SMALL    VARCHAR2    100    B -- BYTE 타입
     3    SUNSHINY    BYTE_TEST    TEXT_BIG    VARCHAR2    4000    B -- BYTE 타입

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

반응형

+ Recent posts