문자형 데이터 타입
내장 문자형 데이터 타입인 CHAR, VARCHAR2, NCHAR, NVARCHAR2의 선언 형식
데이터 타입[ (크기 [BYTE | CHAR] ) ]
문자형 데이터 타입은 모두 선언 시 크기를 지정할 수 있다.
CHAR와 NCHAR는 크기를 생략할 수 있는데 크기를 지정하지 않으면 기본 크기는 1이다.
VARCHAR2와 NVARCHAR2는 반드시 크기를 지정해야 한다.
DECLARE
v_char_default CHAR ; -- 크기가 1인 CHAR
v_char_size CHAR(10); -- 크기가 10인 CHAR
v_nchar_default NCHAR; -- 크기가 1인 NCHAR
v_nchar_size NCHAR(10); -- 크기가 10인 NCHAR
--v_varchar_default VARCHAR2; -- VARCHAR2는 크기를 생략할 수 없다(오류)
v_varchar_size VARCHAR2(10); -- 크기가 10인 VARCHAR
--v_nvarchar_default NVARCHAR2; -- NVARCHAR2는 크기 생략 불가능(오류)
v_nvarchar_size NVARCHAR(10); -- 크기가 10인 NVARCHAR
BEGIN
NULL;
END;
문자형 데이터 타입의 크기 선언은 바이트(BYTE)단위와 문자(CHAR)단위의 두가지를 사용할 수 있다.
단위 생략 시에는 바이트 단위가 된다, BYTE 단위를 사용하면 저장장소의 크기를 문자 집합과 상관없이 바이트 단위로 지정한다, CHAR 단위를 사용하면 저장소의 절대적인 바이트 크기를 지정하는 것이 아니라 저장 가능한 문자의 최대 개수를 지정하게 된다. CHAR 단위를 사용하는 경우 데이터베이스의 문자 집합(CHARACTERSET)과 국가별 문자 집합(NCHAR_CHARACTERSET)에 따라서 저장장소 사용의 최대 크기가 달라진다.
US7ASCII 같은 문자 집합에서는 1 CHAR와 1 BYTE가 동일하지만 KO16KSC5601이나 KO16MSWIN949와 같은 멀티바이트 문자 집합이나 유니코드와 같은 와이드 캐릭터 문자 집합을 사용하는 경우 CHAR 단위와 BYTE 단위의 크기가 다르다.
DECLARE
v_charset VARCHAR2(16); -- 최대 16바이트
v_name1 VARCHAR2(8 CHAR); -- 최대 8글자
v_name2 VARCHAR2(8); -- 최대 8바이트
BEGIN
--Fixed View에서 데이터베이스 문자 집합을 조회해서 출력
SELECT VALUE INTO v_charset FROM v$nls_parameters WHERE parameter = 'NLS_CHARACTERSET';
DBMS_OUTPUT_PUT_LINE('데이터베이스 문자 집합: ' || v_charset);
DBMS_OUTPUT_PUT_LINE(CHR(9)); -- 탭 문자(빈 줄 출력용)
-- 문자 단위
DBMS_OUTPUT_PUT_LINE('v_name1 VARCHAR2(8 CHAR)');
DBMS_OUTPUT_PUT_LINE('========================');
v_name1 := 'Miller'; --알파벳 문자열
DBMS_OUTPUT_PUT_LINE(RPAD(v_name1,9) || ' : ' || lengthb(v_name1) || '바이트');
v_name1 := '을지문덕'; -- 한글 문자열
DBMS_OUTPUT_PUT_LINE(RPAD(v_name1,9) || ' : ' || lengthb(v_name1) || '바이트');
DBMS_OUTPUT_PUT_LINE(CHR(9)); -- 탭 문자(빈 줄 출력용)
-- 바이트 단위
DBMS_OUTPUT_PUT_LINE('v_name2 VARCHAR2(8)');
DBMS_OUTPUT_PUT_LINE('========================');
v_name2 := 'Miller' -- 알파벳 문자열
DBMS_OUTPUT_PUT_LINE(RPAD(v_name2,9) || ' : ' || lengthb(v_name2) || '바이트');
v_name1 := '을지문덕'; -- 한글 문자열
DBMS_OUTPUT_PUT_LINE(RPAD(v_name2,9) || ' : ' || lengthb(v_name2) || '바이트');
END;
데이터베이스 문자 집합 : KO16MSWIN949
v_name1 VARCHAR2(8 CHAR)
========================
Miller : 6바이트
을지문덕 : 8바이트
v_name2 VARCHAR2(8)
====================
Miller : 6바이트
을지문덕 : 8바이트
데이터베이스 문자 집합 : AL32UTF8
v_name1 VARCHAR2(8 CHAR)
========================
Miller : 6바이트
을지문덕 : 12바이트
v_name2 VARCHAR2(8)
====================
Miller : 6바이트
DECLARE
*
1행에 오류:
ORA-06502: PL/SQL: 수치 또는 값 오류: 문자열 버퍼가 너무 작습니다.
수치형 SQL 데이터 타입
PL/SQL에서 지원하는 수치형 SQL 데이터 타입은 NUMBER, BINARY_FLOAT, BINARY_DOUBLE 세가지이다.
비교 항목 | NUMBER | BINARY_FLOAT | BINARY_DOUBLE |
형식 | 십진수형 | FLOAT형 | BOUBLE형 |
선언 형식 | 오라클: NUMBER ANSI: NUMERIC, DECIMAL, DEC, INTEGER, INT, SMALLINT |
오라클: BINARY_FLOAT ANSI: REAL |
오라클: BINARY_DOUBLE ANSI: FLOAT, REAL |
저장 형식 | 오라클 전용 십진수 형식 | IEEE 754 표준 형식 | IEEE 754 표준 형식 |
사용 메모리 크기 | 가변 크기(1~22바이트) | 4바이트 | 8바이트 |
계산 정확성 | 정확 | 오차 발생 | 오차 발생 |
계산 속도 | 느림 | 빠름 | 빠름 |
하드웨어 처리 | 불가능 | 부동 소수점 처리 프로세서 | 부동 소수점 처리 프로세서 |
선언 예 | v_num NUMBER; | v_vbflt BINARY_FLOAT | v_bdbl BINARY_DOUBLE; |
-- 수치형 SQL 데이터 타입 간의 묵시적 형 변환 규칙
NUMBER | BINARY_FLOAT | BINARY_DOUBLE | |
NUMBER | 없음 | BINARY_FLOAT | BINARY_DOUBLE |
BINARY_FLOAT | BINARY_FLOAT | 없음 | BINARY_DOUBLE |
BINARY_DOUBLE | BINARY_DOUBLE | BINARY_DOUBLE | 없음 |
LONG과 LONG RAW 데이터 타입
데이터 타입 LONG은 오라클에서 공식적으로 사용하기를 권하지 않는 데이터 타입이다.
버전 8 이후 LONG 대신 CLOB이, LONG RAW 대신 BLOB이 선호 된다.
LONG과 LONG RAW는 과거 버전에서 작성된 프로그램에 대한 하향 호환성을 위해 지원되는 데이터 타입이므로 사용하지 않는 것이 좋다.
'DATABASE > SQL, PL-SQL' 카테고리의 다른 글
앵커(%)를 사용한 데이터 타입 지정 (0) | 2021.01.19 |
---|---|
데이터 타입 상세 소개 - 2 (0) | 2021.01.19 |
데이터 타입 소개 (0) | 2021.01.19 |
PL/SQL 식별자 - 2 (0) | 2021.01.17 |
PL/SQL 식별자 - 1 (0) | 2021.01.17 |
댓글