Programming/SQL

오라클 문자형 데이터 타입 추가정리 및 인코딩 방식에 따른 메모리크기. 2021-07-07

최동훈1 2021. 7. 7. 16:35

오늘은 어제 내가 깐 SQL Developer로 여러가지 기능을 가지고 놀아본다고, 실질적인 공부내용은 적을수 있다. 그러나 오늘 내가 직접 테이블을 생성해보고, 쿼리를 날려보고, 결과를 눈으로 확인하니, 확실히 그 어떤 학습보다 이해도가 올라갔다.

 

우선 문자 데이터형은  크게

1. CHAR(SIZE(BYTE | CHAR))

 

2.VARCHAR(SIZE(BYTE|CHAR))

 

3.NCHAR(SIZE)

 

4.NVARCHAR(SIZE)

 

SIZE=2BYTE(UTF16)

SIZE=3BYTE(UTF8)

 

가 있다. 난 처음 이전 포스트에 공부할때는 ,이 데이터형의 파라미터가 자리수 인지, 바이트 인지, 아니면 인코딩에 따른 자리수 인지 전혀 구별을 못했는데 이제 확실히 알겠다. 우선 오라클에서 문자를 표현하는 데이텨형은 characterset과 nationalcharacterset 만 존재한다. 그런데 디폴트로 그냥 일반적인 문자 예를들면 '한글' 이렇게 쿼리에 쓴다면 characterset으로 반영되서 저장된다. 그런데 만약 national 즉, 그 나라의 문자를 쓴다면, 한국어,중국어,독어 등..  character형으로 쓰는 것은 비효율 적이다. 왜냐? 바로 UTF8 인코딩을 오라클에서 쓰기 때문이다. 그런데 버전에 따라, DBMS에 따라 다를 수 있으니, 쿼리에

SELECT * FROM NLS_DATABASE_PARAMETERS;

 을 쳐서 어떤 인코딩 체계를 쓰는지 확인을 하면 된다. 내 오라클 18C 버전의 설정.

설정에 보면 National charUTF16 인코딩, 즉 한 글자의 자리수당 2바이트를 사용하고,

 

Char 은 UTF8 인코딩, 즉 한 글자의 자리수당 3바이트를 사용하게끔 설정되어 있다.

 

그렇기에 굳이 같은 글자를 쓰는데 많은 메모리양을 필요로 하는 Char을 쓸 필요 없다. 즉, 일반 영어, 숫자, 기호 등은 1바이트로 쳐지는 CHAR 형을 쓰고, 다른나라언어 한글, 일본어, 독어 등은 NCHAR형을 쓰는 것이다.

또 나는 CHAR(2) 이것이 2CHAR 형 즉 자릿수이기 때문에 2*3바이트인 6바이트가 소모된다고 헷갈렸는데, 그것이 아니라

CHAR(2) -> 저장공간 2Byte

CHAR(2CHAR)-> 저장공간 2*3(UTF8 인코딩을 쓰므로)Byte = 6Byte

 

NCHAR(2) -> 저장공간 2*2(UTF16 인코딩)byte =4byte

 

이렇게 되는 것이다. 또한 위에 자세한 설명 안하고 넘어갔지만, 아무 설정 없이 그냥 한글을 쳤을때 디폴트로 설정된 문자 자료형은 CHAR 이다.

SELECT LENGTHB('한글') FROM DUAL;

이 쿼리를 실행하면,

이렇게 나온다. 한글은 2글자인데 6바이트가 나온것을 보면 1글자당 3바이트 즉 UTF-8 인코딩을 쓰는 CHAR형으로 반영된 것임을 알 수 있다.

 

공부시간 2시간.

순공시간 40분.

 

확실히 눈으로 공부하는것 보다. 내가 직접 만들어보는것이 훨씬 더 학습력이 높다는 것을 알게되었다.