2020년 7월 19일 일요일

오라클 데이터타입, ROWID, 문자데이터 비교 방법, 문자상수(리터럴)와 CHAR, VARCHAR2 비교방법, WHERE절의 NUMBER, VARCHAR2 비교

오라클 데이터타입, ROWID, 문자데이터 비교 방법, 문자상수(리터럴)와 CHAR, VARCHAR2 비교방법, WHERE절의 NUMBER, VARCHAR2 비교

http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=608

3.4 데이터 타입(Data Type)

Description

Max Size(11g)

CHAR(size)

고정길이 문자열

2,000bytes

(default and minimum size는 1 byte)

NCHAR(size)

고정길이 문자열, 유니코드로 저장(varchar2와 같이 1byte 문자열이 아닌 2byte 문자열(UTF-8 / UTF-16)을 지원)

2,000bytes

(default and minimum size는 1 byte)

VARCHAR

Deprecated

(VARCHAR2로 대체됨)

VARCHAR2(size)

가변길이 문자열

4,000 bytes (minimum size는 1 byte)

NVARCHAR2(size)

가변길이 문자열, 유니코드로 저장(varchar2와 같이 1byte 문자열이 아닌 2byte 문자열(UTF-8 / UTF-16)을 지원)

4,000 bytes (minimum size는 1 byte)

NUMBER(p, s)

숫자데이터타입, 정밀도(p)와 스케일(s)로 표시되는 타입, 최대38자리까지 저장가능

scale을 지정하지않고 소수점입력시 반올림된다.

p : 1 ~ 38

s : -84 ~ 127

최대 38자리

BOOLEAN

TRUE, FALSE, NULL값을 가지는 진리형 데이터 타입

PLS_INTEGER

부호있는 정수

PL/SQL에서만 사용가능

-2,147,483,647 ~ 2,147,483,647

BINARY_INTEGER

부호있는 정수

PL/SQL에서만 사용가능

(PLS_INTEGER의 구버전)

-2,147,483,647 ~ 2,147,483,647

LONG

가변길이문자데이터

Deprecated

2G

DATE

날짜 데이터형

BC 4712년1월1일~AD 9999년12월31일

TIMESTAMP(n)

DATE형의 확장

n은 millisecond 자리수로 최대9자리

n본값은 6(0~9가능)

INTERVAL YEAR (n) TO MONTH

년,월을 이용하여 기간저장, n은 년도의 자리 수

n 기본값은 2(0~9가능)

INTERVAL DAY (m) TO SECOND (n)

일,시,분,초를 이용하여 기간을 저장

M은 DAY의 최대크기, n은 millisecond 자리수로 최대9자리

m기본값은 2(0~9가능)

n기본값은 6(0~9가능)

RAW(size)

Raw binary데이터 저장 타입

최대 2000 bytes

LONG RAW

Deprecated

2G

ROWID

16진수 숫자로 된 문자열, 테이블의 레코드를 나타내는 유일한 주소 값

10 bytes

CLOB

대량의 문자데이터 저장

8 TB to 128 TB

(4 Gigabytes - 1) * (database block size)

NCLOB

유니코드, 대량의 문자데이터 저장

8 TB to 128 TB

(4 Gigabytes - 1) * (database block size)

BLOB

이진(binary) 대량 데이터 저장

8 TB to 128 TB

(4 Gigabytes - 1) * (database block size)

BFILE

하드디스크의 바이너리파일에 대한포인터

8 TB to 128 TB

(4 Gigabytes - 1) * (database block size)

CHAR(size)특징

Size로 지정된 길이 보다 작은 데이터 입력시 나머지는 공백(Blank)로 채우며 NULL을 허용하는 칼럼이라면 값이 들어오지 않으면 NULL값이 입력된다. 길이가 고정된 데이터 처리용.

VARCHAR2(size)특징

Size로 지정된 길이 보다 적은 데이터 입력시 빈 공간은 NULL 처리됨. NULL을 허용하는 칼럼이라면 값이 들어오지 않으면 NULL값이 입력된다. 길이가 가변적인 데이터 처리에 용이하다.

문자데이터 비교 방법

CHAR vs CHAR : 길이를 동일하게 맞춘 후 두 문자열을 비교한다.

CHAR vs VARCHAR2 : 타입을 일치시키지 않고 길이가 짧은 문자열까지만 비교, 결국 긴 문자열이 크다.

VARCHAR2 vs VARCHAR2 : 서로 다른 문자가 나올 때 까지 비교하고 길이가 짧은 문자열까지만 비교, 결국 긴 문자열이 크다.

문자상수(리터럴)와 CHAR, VARCHAR2 비교방법

기본적으로 문자상수는 비교대상 컬럼의 데이터 타입으로 내부적으로 변환되어 비교된다.

문자상수 vs CHAR : 문자상수를 CHAR형으로 변환 후 비교

문자상수 vs VARCHAR2 : 문자상수를 VARCHAR2형으로 변환 후 비교

SQL> create table chartest (

2 c char(5),

3 v varchar2(5) );

테이블이 생성되었습니다.

SQL> insert into chartest values ('onj','onj');

1 개의 행이 만들어졌습니다.

SQL> commit;

커밋이 완료되었습니다.

SQL> select 1 from chartest

2 where c = 'onj';

1

----------

1

SQL> select 1 from chartest

2 where v = 'onj';

1

----------

1

SQL> select 1 from chartest

2 where v = c;

선택된 레코드가 없습니다.

WHERE절의 NUMBER, VARCHAR2 비교

WHERE절에 비교되는 칼럼이 숫자, 문자인 경우 숫자를 기준으로 자동 형 변환 된다는 사실을 기억하자. NUMBER, VARCHAR2 자동 형변환에 따른 인덱스의 사용 유무에 대해 알아야 하는데 WHERE절의 비교대상 컬럼의 데이터 타입이 다르면 NUMBER형으로 자동 형 변환된다.

ROWID PseudoColumn : 테이블의 레코드(행, ROW, RECORD)를 유일하게 구별하는 행의 주소 값으로 테이블에 행이 삽입되면 자동으로 생성된다. 테이블의 행을 액세스하기 위한 가장 빠른 방법으로 사용자 임의로 변경은 불가능 하며 10 bytes로 구성된다.

ROWID는 의사칼럼으로 DB저장되어 있지는 않지만 SELECT, WHERE절에 사용될 수 있고 INSERT, UPDATE, DELETE등 으로 변경할 수는 없다.

유일한 주소값이지만 테이블의 PK(Primary Key) 처럼 사용될 수는 없다. 삭제 후 다시 동일한 레코드를 입력한다고 했을 때 ROWID는 변경되며 레코드를 삭제했다면 삭제된 레코드의 ROWID는 나중에 입력되는 다른 레코드에 부여될 수 있다.

SQL> SELECT rowid, ename FROM EMP WHERE ROWNUM < 5;

ROWID ENAME

------------------ ----------

AAAR3sAAEAAAACXAAA SMITH

AAAR3sAAEAAAACXAAB ALLEN

SQL> SELECT ENAME FROM EMP WHERE ROWID = 'AAAR3sAAEAAAACXAAA';

ENAME

----------

SMITH

-- 아래는 테이블이 몇 개의 블록으로 구성되었는지 확인하는 방법이다.

SQL> SELECT COUNT (DISTINCT SUBSTR(rowid,1,15)) "Used"

2 FROM myemp1;

Used

----------

157775

SQL> SELECT COUNT ( DISTINCT

2 DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)

3 ||

4 DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)

5 ) "Used"

6 FROM myemp1;

Used

----------

157775

데이터 건수가 많을 때 두 번째 방법은 별로인 것 같다. 첫번째 방법 보다 10배 정도는 느리다…

PseudoColumn(잠시만요)(의사 칼럼) : SELECT는 되지만 실제 테이블에 저장되는 칼럼 값 은 아닌 것. ROWID, ROWNUM, 시퀀스에서 사용되는 CURRVAL, NEXTVAL, 계층 형 질의에서 사용되는 LEVEL등 이 있다.

댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...