참조
2020-07-23-02.sql
- 오라클에서 사용되는 자료형에는 문자열, 숫자, 날짜, 기타 등으로 구분
- 날짜 : DATE, ?
- 기타 : BLOB(그림,영상 등을테이블 내 저장, BFILE?(테이블밖에저장하고 주소만 테이블안에)
문자열
기본
- 오라클의 문자열 자료는 ''로 묶어 표현 ("": 컬럼의 별칭 쓸 때 사용)
- 문자열 자료형에는 CHAR, VARCHAR, VARCHAR2, LONG, CLOB, NVARCHAR2, NCLOB
- 가장 자주쓰는건 CHAR, VARCHAR2, CLOB (VARCHAR2는 오라클에서만 존재)
- 한글(완성형) 한글자는 3BYTE를 점유
- 조합형: 초성,중성,종성에 코드값 부여해서 따로 따로따로 ex) ㅎ+ㅏ+ㄴ
- 완성형: 1글자 ex) 한
추가지식
- CHAR 제외 전부 가변길이 문자 타입
- 가변: 사용자가 정의한 범위보다 데이터가 작을 때 남은 만큼 SYSTEM에게 반환
- LONG: 2GB, 한 테이블당 하나의 칼럼에만 가능한 제약사항때문에 요즘 잘안쓰고 제약사항없고 4GB지원되는 CLOB씀
- N~: NATIONAL 국제표준으로 저장시킬때 사용 ex. UTF-8, UTF-16
- ASCII코드
1. CHAR
- 고정길이 문자열
- 10byte에서 2byte만 써도 8byte가 공백으로 남는다
- 기본키 컬럼의 데이터 타입으로 사용에 자주 쓰임
- 왼쪽부터 저장되고 남는 공간은 공백으로 PADDING
- 2000BYTE를 초과하는 데이터는 저장할 수 없다.
사용형식
컬럼명 CHAR (크기 [BYTE|CHAR]);
- 2000 BYTE까지 사용 가능
- [BYTE|CHAR] : 크기의 단위 옵션
- BYTE: DEFAULT 값
- CHAR: '크기'는 글자수를 의미. 단, CHAR을 기술해도 2000BYTE를 초과할 수 없다.
(ex. 한글 2000 CHAR불가, 6000BYTE이기때문, 영어, 숫자는 1BYTE)
예제1)
-
예제를 위한 TEMP01 테이블 CREATE
-
TEMP01 테이블에 예제 INSERT
-
잘 되었는지 SELECT 검증
SELECT * FROM TEMP01;
- COL1 값은 10BYTE인데, 두번째 행의 '대한민국'은 12BYTE여서 오류 발생.
- 삽입 불가
- 각 행의 크기(바이트)를 재기 위해 LENGTHB 함수를 이용
2. VARCHAR2
- 가변길이 문자열 저장에 사용
- 4000BYTE까지 가능, 사용자가 입력한 만큼만 쓰고 나머지 공간은 SYSTEM에 반환 = 빈공간 발생 안됨
- 이제 하드 공간 많으니 넉넉하게 VARCHAR2를 씁시다
사용형식
컬럼명 VARCHAR2(크기 [BYTE|CHAR]);
예제1)
-
예제를 위해 CREATE TABLE TEMP02
-
TEMP01 테이블에 예제 INSERT
- COL1이름이 Oracle인것만 보고싶다면
- SELECT * FROM TEMP02 WHERE COL1='Oracle';
- 각 행의 크기(바이트)를 재기 위해 LENGTHB 함수를 이용
3. VARCHAR
- VARCHAR2와 동일 기능 제공
- Oracle 사에서는 VARCHAR2 사용을 권고
- 다른 DBMS에서는 기본 문자열 타입 (가변길이)
4. NVARCHAR2
- 국제표준 코드(다국적 언어)를 사용하여 문자열 저장
- UTF-8(가변길이), UTF-16(고정길이) 형식으로 처리
5. LONG
- 가변길이 문자열 저장
- 2GB까지 처리가능
- 제약사항: 한 테이블당 하나의 컬럼만 사용 가능 -> 치명적인 단점
- 4GB까지 되는 CLOB 타입으로 대체
사용형식
컬럼명 LONG;
- SELECT문의 SELECT절
- UPDATE문의 SET절
- INSERT문의 VALUE절에서 사용 가능
6. CLOB
- LOB: Large OBjects (BLOB: Binary)
- 대용량 문자 자료를 저장하기 위한 데이터 타입
- 가변길이 문자열 저장
- 최대 4GB까지 저장 가능
- 여러개 동시에 CLOB로 지정 가능 (LONG의 단점 보완)
- 일부 기능들은 DBMS_LOB API의 지원을 받아야 됨
- ex) 부분 문자열 추출해야할 때
- 2BYTE = 16BIT = 1111111111111111 -> 66535
최댓값 왜 써놓은거지?
- 이미지같은거 통째로 집어넣을 때, 코드 많은 거 넣을때 사용
- 크기 잴 때 LENGTH 사용: 크기가 무지하게 크기때문에 BYTE재는 LENGTHB같은건 BLOB, CLOB에 사용불가
사용형식
컬럼명 CLOB;
예제1) DBMS_LOB API 이용
-
예제를 위해 CREATE TABLE TEMP04
-
DMBS_LOB API함수를 적용해 SELECT
- LENGTHB와 같은 BYTE수를 체크하는 함수는 BLOB, CLOB에 쓸 수 없다.
- CLOB 문자추출: DBMS_LOB.SUBSTR(컬럼위치,개수(카운트),시작위치(인덱스))
- VARCHAR2 문자추출: SUBSTR(컬럼위치,시작위치(인덱스),개수(카운트))