쌓고 쌓다
[Oracle] 데이터 타입 본문
숫자형 데이터 타입
CHAR(n) : n 크기의 고정 길이 문자 데이터 타입 / 최소 1byte / 최대 2000byte
VARCHAR2(n) : n 크기의 가변 길이 문자 데이터 타입 / 최소 1byte / 최대 4000byte
NVARCHAR2(n) : n 크기의 가변 길이 유니코드 문자(다국어) / 최소 1byte / 최대 4000byte
LOB 데이터 타입
: 텍스트, 그래픽, 이미지, 동영상, 사운드 등 구조화되지 않은 대용량의 텍스트나 멀티미디어 데이터를 저장)
BLOB : 대용량의 바이너리 데이터를 저장하기 위한 데이터 타입 / 최대 4GB
CLOB : 대용량의 텍스트 데이터를 저장하기 위한 데이터 타입 / 최대 4GB
NCLOB : 국가별 문자(유니코드) 데이터 저장
BFILE : 대용량의 바이너리 데이터를 파일 형태로 저장하기 위한 데이터 타입 / 최대 4GB
날짜 데이터 타입
DATE : 날짜 형식을 저장
TIMESTAMP(n) : DATE 타입의 확장된 형태 / n은 milli second 자릿수 (최대:9) / 연, 월, 일, 시, 분, 초 + 밀리초
INTERVAL YEAR TO MONTH : 년과 월을 이용하여 기간을 저장
INTERVAL DAY TO SECOND : 일, 시, 분, 초를 이용하여 기간을 저장 / 두 날짜의 차이를 표현하는데 유용
NUMBER(p,s) : 정밀도(p)와 스케일(s)인 숫자 데이터 / p(소수점 포함 전체 몇자리) : 1~38 / s(소수점 몇자리) : -84 ~ 127
ROWID : 테이블내 행의 고유 주소를 가지는 64진수 문자 타입
CHAR 데이터 타입
- 고정된 문자열을 저장 / 최대 2000byte
- 지정된 길이보다 짧은 데이터가 입력되면, 나머지 공간은 공백으로 채움.
특징
- 사용자가 데이터를 입력하지 않으면 공백이 입력
- 지정된 길이보다 긴 데이터가 들어오면 오류 발생
- 주소 데이터처럼 길이 편차가 심한 데이터를 저장할 때 저장 공간 낭비
- 주민등록번호처럼 고정된 길이에 사용하는것이 좋다.
VARCHAR2 데이터 타입
- 가변 길이의 문자열을 저장하기 위해 사용 / 최대 4000byte
- 지정된 길이보다 짧은 문자열이 입력되면 뒷부분은 NULL로 처리하여 공간 낭비가 없음
특징
- 사용자가 데이터를 입력하지 않으면 남은 공간 반환
- 지정된 길이보다 긴 데이터가 들어오면 입력되지 않고 오류 발생
- 길이 편차가 심한 데이터나 NULL이 많이 입력되는 경우 효율적
- 실무에선 CHAR보단 VARCHAR2를 잘 씀
CHAR와 VARCHAR2의 = 비교시 동일한 데이터지만 비교 결과가 거짓이 되는 경우가 발생하기도 함.
문자형 데이터의 비교
CHAR과 CHAR의 비교 방법
a는 char(7)로 "sql"이 들어가고 남은 4자리는 공백으로 들어가 있음
b는 char(3)로 "sql"이 딱 들어감
이때 비교는 두개의 길이를 동일하게 맞추어서 비교한다.
즉 b가 char(7)이 되어 남은 자리에 공백이 들어가 비교함
결과 : a=b
CHAR과 VARCHAR2의 비교 방법
a는 char(7)로 "sql"과 남은 4자리 공백이 들어가 있다.
b는 varchar2(7)로 "sql"이 딱 들어가 있다
이때 비교는 길이가 짧은 문자열까지만 비교한다.
결과 : a>b (즉 a=b는 거짓이다.)
문자형 데이터 타입과 문자 상수의 비교
문자 상수는 문자 데이터 타입으로 내부 변환되어 비교한다.
동일한 문자 상수를 비교하는 경우에도 비교 대상 칼럼의 데이터 타입에 따라 비교 결과가 달라질 수 있다.
1. 문자 상수와 CHAR 데이터 타입 비교 -> 문자 상수를 CHAR 타입으로 변환 후 두 CHAR를 비교
2. 문자 상수와 VARCHAR2 데이터 타입 비교 -> 문자 상수를 VARCHAR2으로 변환후 두 VARCHAR2를 비교
예제)
CREATE TABLE test
(c CHAR(10), v VARCHAR2(10));
INSERT INTO test
VALUES('sql', 'sql');
테이블을 만들었다.
상수값, CHAR와 VARCHAR2 데이터 타입의 비교해보자.
SELECT * FROM test WHERE c='sql'; /* 결과: c v가 잘 나옴 */
SELECT * FROM test WHERE v='sql'; /* 결과: c v가 잘 나옴 */
SELECT * FROM test WHERE c=v; /* 결과: 안나옴 -> char와 varchar2의 길이가 다르므로 거짓 */
NUMBER 데이터 타입
- 숫자를 저장하며 가변 길이 데이터 타입으로 최대 38자리까지 저장
- 소수는 NUMBER(precision, scale) 형식 / 지정된 자리 이하에서 반올림됨
- 산술 연산이 필요한 데이터를 저장할 때 효율적
ROWID 데이터 타입
- 테이블에서 행의 위치를 지정하는 주소 값
- DB 전체에서 중복되지 않는 유일한 값
- 행 삽입시 테이블 내부에서 자동적 생성
- SELECT로 조회는 가능하나 DML(INSERT, UPDATE)로 수정 불가
- 데이터 객체 번호, 상대적 파일 번호, 블록 번호, 행 번호로 구성
학생 테이블의 ROWID와 학번을 출력
SELECT ROWID, studno FROM student;
'프로그래밍 > SQL' 카테고리의 다른 글
[Oracle] WHERE, 비교 연산자, 논리연산자, SQL 연산자, NULL, 정렬 (0) | 2022.10.02 |
---|---|
[Oracle] SELECT, 합성 연산자(||), DISTINCT, 산술연산, 별명, 정렬, 테이블 구조 (0) | 2022.09.26 |
[SQL] 인덱스 생성 및 제거 (0) | 2022.08.02 |
[SQL] 인덱스(index) (0) | 2022.07.25 |
[SQL] 뷰(View) (0) | 2022.07.20 |