오라클 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 접속하기 (3) | 2021.02.12 |
[리소스 확장의 2가지 방법] 스케일업(Scale up) 스케일아웃(Scale out) (0) | 2021.02.01 |