오라클 VARCHAR2 타입을 사용할 때 데이터 크기를 Byte, Character로 처리하는 방법에 대한 내용입니다.
아래에서 Semantics(의미론)라는 단어 때문에 헷갈릴 수 있는데
Semantics를 '규칙'이라고 치환해서 생각하면 이해하기 편합니다.
CHECK_LEN 테이블에 바이트, 캐릭터 규칙을 적용한
2개 컬럼 생성 및 DATA_LENGTH (해당 컬럼데이터의 최대길이) 확인
-- 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';

한글 3글자는 CHK_VAR_BYTE, CHK_VAR_CHAR 2개 컬럼 모두에 INSERT 가능
-- 한글 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;


-- 문자수(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.
| [DB 정규화] 1정규형, 2정규형, 3정규형 (0) | 2021.04.17 |
|---|---|
| [Oracle] 연속으로 된 날짜 만들기 (CONNECT BY LEVEL 활용) (1) | 2021.03.31 |
| [MySQL] 날짜 형식이 섞여있는 데이터 처리 하기 (0) | 2021.02.14 |
| [Virtualbox] 버추얼박스에 설치한 MySQL 접속하기 (4) | 2021.02.12 |
| [리소스 확장의 2가지 방법] 스케일업(Scale up) 스케일아웃(Scale out) (0) | 2021.02.01 |