# 컬럼 문자(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> 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> 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 |
CREATE TABLE CHAR_TEST(
SEQ NUMBER,
TEXT_SMALL VARCHAR2(100 CHAR),
TEXT_BIG VARCHAR2(4000 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)
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
3 SUNSHINY CHAR_TEST TEXT_BIG VARCHAR2 4000 C
|
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 |
CREATE TABLE BYTE_TEST(
SEQ NUMBER,
TEXT_SMALL VARCHAR2(100),
TEXT_BIG VARCHAR2(4000)
)
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
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
3 SUNSHINY BYTE_TEST TEXT_BIG VARCHAR2 4000 B
|
출처:http://develop.sunshiny.co.kr/969