DataBase/Oracle

[ORACLE]LENGTH vs LENGTHB vs VSize

DevStory 2021. 6. 26.

LENGTH Function

- 문자열의 길이를 반환합니다.

LENGTH( string )

 

LENGTHB Function

- 문자열의 Byte 수를 반환합니다.

LENGTHB( string )

 

VSize Function

- 표현식의 Byte 수를 반환합니다.

VSIZE( expression )

EX 1) LENGTH

SELECT LENGTH('ORACLE') AS LENGTH_RESULT
FROM DUAL;


EX 2) LENGTHB

SELECT LENGTHB('ORACLE') AS LENGTHB_RESULT
FROM DUAL;


EX 3) VSize

SELECT VSIZE('ORACLE') AS VSIZE_RESULT
FROM DUAL;


한글은 Character Set에 따라 byte가 다르다.

'LENGTHB 한글'이라고 구글에 검색을 하면, 한글은 2Byte라고 주장하는 사람도 있으며, 3Byte라고 주장하는 사람도 있습니다.

한글의 Byte는 Character Set에 따라 다릅니다.

 

Character Set은 문자 표현 방식이라고 생각하시면 됩니다.

우리가 알고 있는 UTF와 ANSI도 Character Set에 포함되는 것 중 하나입니다.

 

Character Set 확인 방법

SELECT *
FROM   NLS_DATABASE_PARAMETERS
WHERE  PARAMETER = 'NLS_CHARACTERSET';

 

한글을 지원하는 Character Set와 Byte

Character Set Byte 수
KO16KSC5601 2 byte
KO16MSWIN949 2 byte
AL32UTF8 3 byte

 

한글의 Byte 수 확인

SELECT LENGTHB('가나')
FROM DUAL;

제 데스크톱 개발 환경에서는 Character Set이 KO17MSWIN949로 설정이 되어서 한글이 2 Byte로 계산됩니다.


LENGTHB vs VSize

LENGTHB 함수는 문자열로 변환 후 Byte 수를 계산합니다.

VSize는 문자열로 변환하지 않습니다.

 

SELECT SYSDATE
     , LENGTHB(SYSDATE) AS LENGTHB_SYSDATE
     , VSIZE(SYSDATE) AS VSIZE_SYSDATE
FROM DUAL;

위 쿼리 실행 결과 SYSDATE의 LENGTHB와 VSIZE의 결과가 다른 것을 확인할 수 있습니다.

 

SELECT SYSTIMESTAMP
     , LENGTHB(SYSTIMESTAMP) AS LENGTHB_SYSTIMESTAMP
     , VSIZE(SYSTIMESTAMP) AS VSIZE_SYSTIMESTAMP
FROM DUAL;

SYSTIMESTAMP도 LENGTHB와 VSIZE의 결과가 다릅니다.

 

LENGTHB 함수는 매개변수를 문자열로 변환 후 Byte 수를 계산합니다.

SELECT SYSDATE
     , LENGTHB(SYSDATE) AS LENGTHB_SYSDATE
     , LENGTHB(TO_CHAR(SYSDATE)) AS LENGTHB_TO_CHAR_SYSDATE
     , VSIZE(SYSDATE) AS VSIZE_SYSDATE
     , VSIZE(TO_CHAR(SYSDATE)) AS VSIZE_TO_CHAR_SYSDATE
FROM DUAL;

LENGTHB함수는 SYSDATE의 값 '26-JUN-21'를 문자열로 변환 후 Byte를 수를 반환합니다.

VSIZE함수는 문자열로 변환하지 않고 Byte 수를 반환합니다.

 

SYSDATE는 DATE Type으로 Byte 수가 7입니다.

SYSTIMESTAMP는 DATE Type으로 Byte 수가 13입니다.

 

VSIZE함수는 SYSDATE, SYSTIMESTAMP의 DATE Type의 Byte 수를 반환하기 때문에 LENGTHB와 다른 결과가 나옵니다.


오라클 설정에 따른 SYSDATE의 결과

오라클 설정에 따라서 SYSDATE 데이터 표기 형식이 다릅니다.

SELECT SYSDATE
     , TO_CHAR(SYSDATE) AS SYSDATE_TO_CHAR
FROM DUAL;

저는 언어를 한글로 설정하였기 때문에 SYSDATE가 한글로 변환하여 조회됩니다.

LENGTHB 함수는 한글로 변환되기 전에 문자열로 변환 후 Byte 수를 반환합니다.

LENGTHB 함수가 문자열로 변환하기 전에 한글을 적용했다면, 결과는 23이 나와야 합니다.

SELECT SYSDATE
     , TO_CHAR(SYSDATE) AS SYSDATE_TO_CHAR
     , LENGTHB(SYSDATE) AS SYSDATE_LENGTHB
     , LENGTHB('2021-06-26 오후 8:26:48') AS LENGTHB_KOR
     , LENGTHB('26-JUN-21') AS LENGTHB_STR
FROM DUAL;


마무리

오라클 함수에 대해 알아보고 있는데, VSize라는 함수를 처음 봐서 공부해봤습니다.

사용할 일은 거의 없는 함수라서 그런지 VSize에 대한 자료가 많지 않았습니다.

여러 가지 쿼리를 실행해보고 자료를 계속해서 찾아본 결과 차이점을 알 수 있었고 SYSDATESYSTIMESTAMP에 대해 좀 더 공부할 수 있었습니다.


참고

VSize에서 SYSDATE 사용 결과

https://community.oracle.com/tech/developers/discussion/654999/length-vs-vsize-use-of-vsize-in-practical-scenario

 

LENGTH vs LENGTHB vs VSize의 개념

http://www.gurubee.net/article/26198

 

반응형

댓글