행궁동 데이터 엔지니어

반응형

오라클 VARCHAR2 타입을 사용할 때 데이터 크기를 Byte, Character로 처리하는 방법에 대한 내용입니다.

  • 참고 : 오라클 VARCHAR2 타입의 데이터 크기는 1 ~ 4000 Bytes 범위로 설정할 수 있습니다. 

아래에서 Semantics(의미론)라는 단어 때문에 헷갈릴 수 있는데

Semantics를 '규칙'이라고 치환해서 생각하면 이해하기 편합니다.

 

  • Byte semantics (바이트 규칙) : Varchar2 타입 컬럼 최대 데이터 크기를 Bytes 기준으로 설정
    • 사용방법 : VARCHAR2(길이 BYTE)
    • EX) VARCHAR2(10 BYTE)
  • Character Semantics (캐릭터 규칙) : Varchar2 타입 컬럼 최대 데이터 크기를 Character(문자수) 기준으로 설정
    • 사용방법 : VARCHAR2(문자수 CHAR)
    • EX) VARCHAR2(10 CHAR) ← 오라클의 기본 CHARSET인 AL32UTF8은 문자 1개당 4 BYTES 이므로 10 CHAR로 설정하면 최대 데이터 길이는 10 * 40 = 40 BYTES가 됨

 

테이블 생성 : VARCHAR2 바이트, 캐릭터 규칙 2개 모두 사용

CHECK_LEN 테이블에 바이트, 캐릭터 규칙을 적용한

2개 컬럼 생성 및 DATA_LENGTH (해당 컬럼데이터의 최대길이) 확인

  • CHK_VAR_BYTE VARCHAR2(10 BYTE), DATA_LENGTH = 10
  • CHK_VAR_CHAR VARCHAR(10 CHAR), DATA_LENGTH = 40
-- BYTE, CHARACTER SEMANTICS 확인용 테이블 생성 
-- 테이블 명 : CHECK_LEN
CREATE TABLE CHECK_LEN (
    CHK_VARCHAR VARCHAR2(10), -- VARCHAR (N)
    CHK_VAR_BYTE VARCHAR2(10 BYTE), -- VARCHAR (N BYTE)
    CHK_VAR_CHAR VARCHAR2(10 CHAR) -- VARCHAR (N CHAR)
);

-- 생성한 테이블의 컬럼정보 확인
-- USER_TAB_COLUMNS 에서 'CHECK_LEN' 테이블 확인
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH 
    FROM USER_TAB_COLUMNS
    WHERE TABLE_NAME = 'CHECK_LEN';

 

 

테이블 생성 결과 및 DATA_LENGTH

 

 

데이터 INSERT 테스트 및 LENGTH 확인

  • 한글 3글자는 CHK_VAR_BYTE, CHK_VAR_CHAR 2개 컬럼 모두에 INSERT 가능

  • 하지만 6글자인 '홍길동입니다' 는 한글 1글자가 3BYTES 로 6 * 3 = 18BYTES 이기 때문에  CHK_VAR_CHAR에만 INSERT 성공
  • 오라클 내장 함수인 LENGTHB() 로 데이터의 길이(BYTES) 확인 
  • 참고 : LENGTHB가 아닌 LENGTH 함수를 사용하면 데이터의 문자수 확인 가능

 

-- 한글 3글자 INSERT 테스트
-- 한글 1글자 3BYTES, 3 BYTES * 3 = 9BYTES로 정상적으로 INSERT
INSERT INTO CHECK_LEN VALUES ('홍길동', '홍길동', '홍길동');

SELECT LENGTHB(CHK_VARCHAR), LENGTHB(CHK_VAR_BYTE), LENGTHB(CHK_VAR_CHAR) FROM CHECK_LEN;

-- VARCHAR2 (CHAR 10) 에는 '홍길동입니다' INSERT 성공
INSERT INTO CHECK_LEN(CHK_VAR_CHAR) VALUES ('홍길동입니다');

-- VARCHAR2 (BYTE 10) 에는 '홍길동입니다' INSERT 실패 
-- 한글 6글자는 18BYTES 
INSERT INTO CHECK_LEN (CHK_VAR_BYTE) VALUES ('홍길동입니다');

-- 확인
-- LENGHTB : 문자열의 길이를 BYTES 로 변환해주는 오라클 내장 함수
SELECT LENGTHB(CHK_VARCHAR), LENGTHB(CHK_VAR_BYTE), LENGTHB(CHK_VAR_CHAR) FROM CHECK_LEN;

-- LENGHT : 문자의 개수를 반환해주는 오라클 내장 함수
SELECT LENGTH(CHK_VARCHAR), LENGTH(CHK_VAR_BYTE), LENGTH(CHK_VAR_CHAR) FROM CHECK_LEN;    

 

 

 

LENGTHB() 함수  : BYTES 를 반환
LENGTH() 함수 : 문자의 개수 반환

 

 

 

기타 참고자료

  • NLS_DATABASE_PARAMETERS : 문자수 기준으로 VARCHAR2 설정 시 문자당 Byte는 NLS_CHARACTERSET 값을 따름
-- 문자수(CHAR) 기준으로 VARCHAR2 생성시 길이는
-- NLS_DATABASE_PARAMETERS 의 NLS_CHARACTERSET 값을 따름
SELECT * FROM NLS_DATABASE_PARAMETERS
    WHERE PARAMETER = 'NLS_CHARACTERSET';
    
-- VARCHAR2(N) 형식으로 BYTE, CHAR를 명시하지 않을 경우
-- NLS_SESSION_PARAMETERS 의 NLS_LENGTH_SEMANTICS 값을 따른다.
SELECT * FROM NLS_SESSION_PARAMETERS
    WHERE PARAMETER = 'NLS_LENGTH_SEMANTICS';

 

 

참고자료

https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832

 

The length semantics of character datatypes can be measured in bytes or characters.

  • Byte semantics treat strings as a sequence of bytes. This is the default for character datatypes.
  • Character semantics treat strings as a sequence of characters. A character is technically a codepoint of the database character set.
반응형

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band