[Oracle SQL] 문자열데이터타입

고동이의 IT·2021년 10월 7일
0

Oracle SQL

목록 보기
21/31

> # 데이터 타입

  • 오라클에 사용되는 데이터 타입은 문자열, 숫자, 날짜, 이진데이터 타입으로 구분

1.문자열 데이터 타입

. 오라클은 문자타입은 존재하지 않음

. 모든 문자열은 ' '안에 기술되어야함.

. ' '에 기술되는 문자열은 대소문자 구별 됨

. 문자열 데이터 타입은 CHAR, VARCHAR, VARCHAR2, NVARCHAR, LONG, CLOB, NCLOB등이 있음

1) CHAR

  • 고정길이 데이터를 저장

  • 최대 2000 byte 저장 가능

  • 기억공간이 남으면 오른쪽에 남는 공간에 공백이 채워짐

  • 기본키 설정이나 확정된 길이를 나타내는 컬럼(주민번호 등)

(사용형식)

컬럼명 CHAR(크기[BYTE|CHAR])

50CHAR = 고정길이 50개의 문자가 저장될 수 있는 공간 만들어짐

50BYTE = 50 BYTE 만큼 공간만들어짐.

. '크기[BYTE|CHAR]' : '크기'가 byte 인지 글자의 갯수인지 설정, 기본은 byte(생략하면 BYTE)

. 한글 한글자는 3 BYTE(최대 666글자 저장)

사용예)

CREATE TABLE TEMP01(

COL1 CHAR(50),

COL2 CHAR(50 BYTE),

COL3 CHAR(50 CHAR));

INSERT INTO TEMP01

VALUES('1L POSTINO','1L POSTINO','일 포스티노');

​

SELECT *

FROM TEMP01;

​

SELECT LENGTHB (COL1),

LENGTHB (COL2),

LENGTHB (COL3)

FROM TEMP01;

2) VARCHAR2(n), NVARCHAR2(n), VARCHAR(n)

  • 가변길이 문자열 저장

  • 최대 4000byte까지 저장가능. 한글 1333개까지 가능.

  • NVARCHAR2 는 국제표준 코드(UTF-8, UTF-16)로 저장

  • VARCHAR 와 처리 방식은 동일

(사용형식)

컬럼명 VARCHAR2(n [BYTE|CHAR]).

DEFAULT는 BYTE.굳이 글자수로 제한하겠다 할때는 CHAR 을 옵션으로 기술.

  • 오라클에서 고정길이는 CHAR 하나이다.

  • LONG 자바에서는 긴 정수. 오라클에서는 안씀. 대용량 데이터를 처리할수 있는 가변길이 머시깽이가 개발됨 = CLOB.

  • 문자열 처리에 있어서 80-90% 이상은 VARCHAR2

사용예)

 CREATE TABLE TEMP02(

COL1 CHAR(10),

COL2 VARCHAR2(4000),

COL3 VARCHAR2(100)

);
​
INSERT INTO TEMP02

VALUES('무궁화', '무궁화 꽃이 피었습니다.', '무궁화 꽃이 피었습니다.');

​

SELECT * FROM TEMP02;

​

SELECT LENGTHB(CON1), LENGTHB(CO2),LENGTHB(COL3)

FROM TEMP02;
​

무궁화: 9바이트가 아니라 <10바이트>. 10바이트중 1바이트는 안써지고 공백처리되기때문

무궁화 꽃이 피었습니다: 10글자 한글3바이트, 공백 두개, 마침표1개 개당 1바이트 = ,<33바이트>까지만 쓰고 안씀 나머지 3967바이트는 운영체제에

반납됨

3) LONG

  • 대용량 분자열 처리를 위한 데이터타입

  • 최대 2gb 까지 처리 가능

  • 한 테이블에 하나의 LONG 타입만 사용 가능

  • 현재 기능 개선 서비스가 종료(오라클 8버전) => CLOB 타입으로 대체

  • 1024 BYTE. 2의 31승 만큼의 문자를 저장가능.

(사용형식)

컬럼명 LONG;

. 특정 문자열 함수(LENGTHB 등)는 사용할 수 없음.

. SELECT 문의 SELECT 절, UPDATE 문의 SET 절, INSERT 문의 VALUES 절에 사용 가능.

사용예)

CREATE TABLE TEMP03 (

COL1 CHAR(10),

COL2 VARCHAR2(100),

COL3 LONG

);

​

INSERT INTO TEMP03

VALUES('홍길동','대전시 중구 중앙로 76 영민빌딩 4층',

'대전시 중구 중앙로 76 영민빌딩 4층');

-- 홍길동 10바이트. 9바이트 사용 1바이트 공백

-- VARCHAR2 대전시 중구 중앙로 76 영민빌딩 4층 
- > 47바이트 사용. 나머지 53바이트는 반납

-- LONG 대전시 중구 중앙로 76 영민빌딩 4층 -
> 2기가 중 47바이트 쓰고 나머지 반납

​

​

SELECT * FROM TEMP03;

​

SELECT LENGTHB(COL1),

LENGTHB(COL2)

-- LENGTH(COL3)

FROM TEMP03;

​

-- LONG 타입 COL3는 너무 커서 LENGTHB 등 
대부분의 문자열 예약어 못씀.,.,.,.
​

​

4) CLOB(Character Large OBjects)

  • LONG 타입의 기능을 개선한 가변 문자열 데이터 타입

  • 최대 4gb 까지 저장 가능

  • 한 테이블에 복수개의 CLOB 정의 가능

  • 일부 기능은 DBMS_LOB Api(Application Programming Interface)의 지원을 받아야 함

(사용형식)

컬럼명 CLOB;


사용예)

CREATE TABLE TEMP04(

COL1 VARCHAR2 (4000),

COL2 LONG,

COL3 CLOB,

COL4 CLOB

);

​

--CLOB 는 한테이블에 복수개 사용가능.

​

INSERT INTO TEMP04

VALUES 
('대전시 중구 중앙로 76 영민빌딩 4층', '대전시 중구 중앙로 76 영민빌딩 4층',

'대전시 중구 중앙로 76 영민빌딩 4층', '대전시 중구 중앙로 76 영민빌딩 4층');

​

SELECT * FROM TEMP04;

​

SELECT SUBSTR(COL1,8,6)

SUBSTRING = > 주어진 문자열에서 부분문자열을 추출할때 사용하는 문자열 함수

COL1, 8, 6은 매개변수. 맨첫번째는 원본데이터가 들어가있음.

두번째는 시작 위치로 1번부터셈 <> 자바는 위치값을 셀 때0 번부터 셈

세번째는 개수. <> 자바는 두번째가 STAR INDEX고 세번째가 AND INDEX. 자바는 끝값이 커야함

오라클 6,10 -> 6번째에서 10글자떼라

자바 6,10 -> 9글자 떼라?

SELECT SUBSTR(COL1, 8, 6),

SUBSTR(COL3, 8, 6),

DBMS_LOB.SUBSTR(COL3,8,6),

-- LENGTHB(COL4),

DBMS_LOB.GETLENGTH(COL4)

FROM TEMP04;
​

LENGTHB는 CLOB 나 NCLOB 에서 지원안됨. 그래서 DBMS_LOB.GETLENGTH(COL4) 써야됨. 컬럼4에 저장되어있는 글자수를 세어서 반환해준다.

DBMS_LOB.SUBSTR(COL3,8,6)는 DBMS_LOB라는 API에 존재하는 서브 스트링

"."은 소속을 나타냄. 6번째에서 8글자 떼라는 뜻.

TRIM (컬럼명) -> 이 컬럼에 저장되어 있는 데이터를 꺼내와서 그 데이터 앞 또는 뒤에 남아있던 모든 공백을 날리고 알짜 데이터만 가져옴

공백의 아스키 코드는 40

TRIM 쓰면 "홍길동 " = "홍길동" 됨. 공백을 제거하기 때문에

profile
삐약..뺙뺙

0개의 댓글