데이터 타입 상세 소개 - 1

    문자형 데이터 타입

    내장 문자형 데이터 타입인 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

    댓글