💾 CLOB vs BLOB - 대용량 데이터를 저장하는 두 가지 방식

 

RDBMS(관계형 데이터베이스)에서는 종종 텍스트나 파일 같은 대용량 데이터를 다뤄야 할 때가 있습니다.
이럴 때 사용하는 대표적인 데이터 타입이 바로 CLOB(Character Large Object)와 BLOB(Binary Large Object)입니다.
이번 글에서는 이 둘의 차이와 활용 방법에 대해 정리해 보겠습니다.


📌 1. CLOB이란?

CLOB(Character Large Object)는 대용량 텍스트 데이터를 저장하기 위한 데이터 타입입니다.

예시

  • 장문의 기사 본문
  • JSON/XML 형식의 긴 설정값
  • 문서 내용 (예: 계약서, 보고서 등)

특징

  • 문자열(문자 기반) 데이터 전용
  • 일반적으로 최대 수십 MB~수 GB까지 저장 가능 (DBMS마다 다름)
  • JDBC에서는 java.sql.Clob으로 처리됨

📌 2. BLOB이란?

BLOB(Binary Large Object)는 이미지, 동영상, PDF, 실행파일 등 바이너리 데이터를 저장하는 타입입니다.

예시

  • 이미지 파일 (JPG, PNG 등)
  • 동영상 파일
  • 바이너리 파일(exe, zip 등)

특징

  • 비정형(바이너리) 데이터 전용
  • 텍스트가 아닌 데이터는 반드시 BLOB을 사용
  • JDBC에서는 java.sql.Blob으로 처리됨

📊 CLOB vs BLOB 비교 정리

구분 CLOB BLOB
의미 Character Large Object Binary Large Object
용도 긴 텍스트 저장 이미지, 파일 등 바이너리 저장
데이터 형태 문자 기반 (UTF-8 등 인코딩) 바이너리 기반 (byte)
JDBC 타입 java.sql.Clob java.sql.Blob
처리 방식 Reader / Writer InputStream / OutputStream
주 사용 예시 뉴스 본문, 소설, XML, JSON 사진, 동영상, PDF, ZIP 등

🛠️ 사용 예시 (JDBC 기준)

✅ CLOB 저장

PreparedStatement ps = conn.prepareStatement("INSERT INTO article (title, content) VALUES (?, ?)");
ps.setString(1, "클롭 예제");
ps.setClob(2, new StringReader("긴 텍스트 내용..."));
ps.executeUpdate();

✅ BLOB 저장

PreparedStatement ps = conn.prepareStatement("INSERT INTO files (filename, data) VALUES (?, ?)");
ps.setString(1, "image.jpg");
ps.setBlob(2, new FileInputStream(new File("image.jpg")));
ps.executeUpdate();

 


💡 스프링(Spring)에서는 어떻게 다룰까?

Spring JDBC 또는 JPA에서도 CLOB/BLOB 처리는 가능합니다.

JPA 예시

@Lob
private String content; // CLOB 처리됨

@Lob
private byte[] fileData; // BLOB 처리됨
  • @Lob 어노테이션은 필드를 CLOB 또는 BLOB으로 자동 매핑합니다.
  • String이면 CLOB, byte[]이면 BLOB으로 판단함

⚠️ 주의할 점

  1. 성능 이슈: CLOB/BLOB은 많은 I/O를 유발하므로 트래픽이 많은 서비스에서 남용은 금물입니다.
  2. 파일 vs DB 저장 고민:
    • 파일을 DB에 직접 저장하지 않고, 파일 경로만 저장하고 실제 파일은 서버나 S3 등에 저장하는 방식도 많이 씁니다.
  3. DBMS별 제한: Oracle, MySQL, PostgreSQL 등 DB마다 최대 크기와 처리 방식이 다르니 문서 확인 필수입니다.
  4. 트랜잭션 크기: 너무 큰 BLOB 데이터를 저장하거나 수정할 경우 트랜잭션 크기 제한에 걸릴 수 있음

📚 정리

질문 답변
텍스트 저장하려면? CLOB
파일/이미지 저장하려면? BLOB
문자 기반인가요? CLOB는 문자, BLOB은 바이너리
JPA에서는 어떻게? @Lob + String 또는 byte[]
직접 DB에 저장해도 되나요? 가능하지만, 파일 시스템 저장이 더 효율적일 수 있음

 

📝 마무리

CLOB과 BLOB은 데이터베이스에서 대용량 데이터를 다룰 때 반드시 알아야 할 개념입니다.

용도에 맞게 잘 활용하면 유용하지만, 과도하게 사용하면 성능 문제를 초래할 수 있습니다.

실제 프로젝트에서는 "직접 DB에 저장할지, 파일로 분리할지" 고민한 후 선택하는 것이 중요합니다.

 

데이터베이스란?

데이터베이스(Database)란, 체계적이고 구조화된 방식으로 데이터를 저장, 관리, 및 활용하기 위한 시스템이다.
이를 제어하고 관리하는 통합 시스템은 DBMS(Database Management System)라 불린다.

정의: 데이터베이스는 특정 데이터를 효율적으로 관리하고 필요한 정보를 빠르게 조회하기 위해 설계된 데이터 모음이다.
데이터 입력, 삭제, 수정, 조회는 쿼리 언어(Query Language)를 통해 실행된다.

 

 

데이터베이스의 정의

데이터베이스는 조직적 업무를 수행하기 위해 필요한 상호 관련된 데이터를 의미하며, 다음과 같은 속성을 가진다.

  1. 통합 데이터 (Integrated Data):
    • 중복을 최소화한 데이터의 집합.
  2. 저장된 데이터 (Stored Data):
    • 컴퓨터가 접근할 수 있는 저장 매체에 보관된 데이터.
  3. 운영 데이터 (Operational Data):
    • 조직에서 반드시 필요한 데이터를 포함하며 실시간 접근이 가능한 데이터.
  4. 공유 데이터 (Shared Data):
    • 여러 시스템과 사용자 간에 공동으로 이용되는 데이터.

 

데이터베이스 사용 이유

과거에는 데이터를 파일 시스템으로 관리했지만, 이 방식은 데이터 중복, 비효율성, 무결성 문제를 야기하였다.
데이터베이스는 이러한 문제를 해결하며 다음과 같은 이점을 제공한다.

  1. 데이터 중복 최소화
    • 파일 단위 관리로 인한 불필요한 데이터 중복 제거.
  2. 데이터 무결성 확보
    • 데이터 일관성을 유지하며, 손실 가능성을 줄임.
  3. 독립적 처리 지원
    • 독립적인 애플리케이션 간 데이터의 상호 연동이 가능.

 

데이터베이스의 주요 특징

  1. 실시간 접근성 (Real-Time Accessibility):
    • 데이터 요청에 대해 실시간으로 응답 가능.
  2. 지속적 변화 (Continuous Evolution):
    • 새로운 데이터의 추가, 삭제, 갱신을 통해 최신 상태를 유지.
  3. 동시 공유 (Concurrent Sharing):
    • 여러 사용자가 동일 데이터를 동시에 접근 가능.
  4. 내용 기반 참조 (Content Reference):
    • 데이터의 위치가 아닌 내용으로 접근 가능.

 

데이터베이스의 장점

  1. 독립성
    • 물리적 독립성: 데이터 크기나 저장 위치 변경 시, 관련 응용 프로그램을 수정할 필요 없음.
    • 논리적 독립성: 논리적 구조 변경 시에도 기존 응용 프로그램 유지.
  2. 무결성
    • 데이터 유효성을 보장하여 오류를 방지.
  3. 보안성
    • 접근 권한 설정으로 데이터 보호 가능.
  4. 일관성
    • 데이터 간 논리적 관계를 유지하여 모순 방지.
  5. 중복 최소화
    • 데이터 중복을 줄여 저장 공간 효율성 향상.

 

데이터베이스의 성능 요인

  1. 디스크 I/O 성능
    • 디스크 헤더의 이동과 데이터 읽기/쓰기 속도에 따라 성능이 결정.
  2. 랜덤 접근 속도
    • 데이터베이스 성능은 랜덤 I/O를 얼마나 효율적으로 줄이느냐에 따라 크게 좌우됨.
  3. 최적화
    • 쿼리 튜닝과 인덱스를 활용하여 성능 향상.

 

결론

데이터베이스는 현대 정보 시스템의 핵심으로, 데이터의 효율적 관리와 정확한 정보 제공을 가능하게 한다.이를 통해 조직은 데이터 기반 의사결정을 내리고, 비즈니스 목표를 효과적으로 달성할 수 있다.

 

 

SELECT... INTO Outfile Load Data 쌍으로 이어지는 데이터 언로드와 데이터 로드 문법입니다. 둘다 mysql 커맨드 인터페이스 프로그램에서 수행됩니다. 문제가 자주 발생되는 테이블(사용자의 데이터 삭제나 엔진문제로 인한 크래쉬) 대해 데이터베이스 레벨로 덤프를 받기는 부담스러울때 백업용도로 받거나 데이터 이관, 혹은 마이그레이션 같은 특정 용도로 사용할때 좋습니다.

 

■ mysqldump SELECT...INTO Outfile 문법의 차이점.

mysqldump 같이 SELECT...INTO문법은 테이블 데이터를 덤프하지만 차이는 mysqldump Query 문법으로 Database 덤프하지만 SELECT...INTO Outfile문법은 순수하게 데이터만 덤프합니다. 

다음의 예제는 어떠한 옵션도 붙이지 않고 순수하게 명령문만을 이용해서 출력한 예제입니다.

 

▶ mysqldump 프로그램을 이용한 덤프파일내용

SQL 문법으로 구성됩니다.

create database db_name;

create table tb_name(c1 char(10));

insert into tb_name values(1,2),(3,4);

 

▶ SELECT...INTO Outfile 문법을 이용한 덤프파일 내용

(아무 옵션도 없이 데이터 덤프시. 옵션이 없다라기보단 기본 옵션으로 출력된 데이터입니다. 위의 기본문법에 의해 출력된 데이터입니다.)

순수하게 데이터 내용으로만 구성되어 있습니다.

10001   Senior Engineer 1986-06-26      9999-01-01

10002   Staff   1996-08-03      9999-01-01

10003   Senior Engineer 1995-12-03      9999-01-01

10004   Engineer        1986-12-01      1995-12-01

10004   Senior Engineer 1995-12-01      9999-01-01

10005   Senior Staff    1996-09-12      9999-01-01

 

 

■ SELECT...INTO Outfile 사용방법

 필드 옵션과 라인 옵션

SELECT...INTO Outfile 문이던 Load Data 문이던 둘다 다음과 같은 필드 옵션을 이용해서 데이터를 덤프하거나 로드합니다. 다음의 옵션을 적적히 사용하여 덤프및 로드를 같이 사용해서 데이터를 옮겨야 합니다.

 

SELECT * | Column1, column2 INTO OUTFILE 'directory/file_name'

[{FIELDS | COLUMNS}

     [TERMINATED BY 'string']

     [[OPTIONALLY] ENCLOSED BY 'char']

     [ESCAPED BY 'char']

]

[LINES

     [STARTING BY 'string']

     [TERMINATED BY 'string']

 

- 옵션설명

FIELDS 

TERMINATED BY : 필드 구분자

ENCLOSED BY : 필드를 구분지을  있는 시작과  문자. '문자' -> 싱글쿼테이션(') 의미

OPTIONALLY ENCLOSED BY : 필요할경우 필요한 구분자를  추가 

FIELDS ESCAPED BY : 필드를 빠져나올  있는 구분자. 예를 들어 데이터에 빈값이 들어있다면  필드를 빠져나올  있는 방법이 있어야 합니다. 그렇지 않으면 컬럼 갯수 대비 데이터가 맞지 않거나, 순서가 틀리거나 어긋날  있습니다.

LINES TERMINATED BY : 라인() 구분자.

 

 기본문법

쿼리문 형태와 비슷합니다. select 문법을 이용해서 데이터를 덤프합니다. select  덤프할 원하는 컬럼을 입력합니다. 특수한 상황이 아닌이상 컬럼보다는 *   많이 이용합니다. 그리고 from 아닌 outfile문을 이용하여 어느 디렉토리, 파일명으로 덤프할것인지 정합니다. 다음 덤프할  어떤 방법으로 덤프할지 옵션을 지정합니다. 옵션은 LINE 옵션과 필드 옵션이 있습니다. 위에서 설명했습니다. 이것을 이용하여 데이터를 어떻게 덤프할지 정합니다. 다음 덤프할 테이블명을 입력합니다. from 테이블 명으로 합니다. 마지막으로 옵션절입니다. 특정 데이터 범위만 덤프할   있고 연산을 통하여 덤프할 수도 있습니다.

 

SELECT col1, col2 INTO OUTFILE 'data.txt'

  FIELDS TERMINATED BY ','

  FROM table2

where col1 > 10

and col2=‘A’;

 

위와같이 쿼리문을 이용하여 원하는 방법으로 유연하게 데이터를 덤프할  있습니다.

 

■ Load Data 사용방법   옵션 설명 그리고 예제

Load Data 고속 데이터 적재 방법입니다. mysqldump 덤프된 파일보다 훨씬 빠릅니다. 또한 mysqlimport라는 프로그램을 제공하는데  프로그램이 내부적으로 load data 문법을 호출해서 수행합니다. 당연히 mysql클라이언트에 로그인하지 않고 로드하고 싶다면 mysqlimport프로그램을 사용하시면 됩니다.

 

LOAD DATA  SELECT ... INTO OUTFILE 문의 경우 FIELDS  LINES 절의 구문이 동일합니다.   모두 선택 사항이지만   지정되면 FIELDS LINES보다 앞에 와야합니다.

 

FIELDS 절을 지정하면, 각각의 부속  (TERMINATED BY, [OPTIONALLY] ENCLOSED BY  ESCAPED BY) 선택 사항이지만,   하나 이상을 지정해야합니다.  절의 인수는 ASCII 문자  포함   있습니다.

 

 

 필드  라인 옵션

LOAD DATA

    [LOW_PRIORITY | CONCURRENT] [LOCAL]

    INFILE 'file_name'

    [REPLACE | IGNORE]

    INTO TABLE tbl_name

    [PARTITION (partition_name [, partition_name] ...)]

    [CHARACTER SET charset_name]

    [{FIELDS | COLUMNS}

        [TERMINATED BY 'string']

        [[OPTIONALLY] ENCLOSED BY 'char']

        [ESCAPED BY 'char']

    ]

    [LINES

        [STARTING BY 'string']

        [TERMINATED BY 'string']

    ]

    [IGNORE number {LINES | ROWS}]

    [(col_name_or_user_var

        [, col_name_or_user_var] ...)]

    [SET col_name={expr | DEFAULT},

        [, col_name={expr | DEFAULT}] ...]

 

 

- Partition Table 지원

파티션 테이블인경우 파티션명을 지정해서 데이터를 로드할  있습니다. 파티션 구조를 알면 직접 지정해서 로드하므로 좀더 빨리 작업을   있습니다.

 

- 입력 파일 이름, 위치  내용 해석

서버는 character_set_database 시스템 변수로 표시된 문자 세트를 사용하여 파일의 정보를 해석합니다. SET NAMES  character_set_client 설정은 입력 해석에 영향을 미치지 않습니다. 입력 파일의 내용이 기본값과 다른 문자 세트를 사용하는 경우 일반적으로 CHARACTER SET 절을 사용하여 파일의 문자 세트를 지정하는 것이 좋습니다. 이진 문자 집합은 "변환 없음" 지정합니다.

 

LOAD DATA 필드 값이 로드되는 열의 데이터 유형에 관계없이 파일의 모든 필드가 동일한 문자 세트를 갖는 것으로 해석합니다. 파일 내용을 올바르게 해석하려면 파일이 올바른 문자 세트로 작성되었는지 확인해야합니다. 예를 들어, mysqldump -T 사용하거나 mysql에서 SELECT ... INTO OUTFILE 문을 발행하여 데이터 파일을 작성하는 경우 --default-character-set 옵션을 사용하여 출력이 문자 세트에 기록되도록 합니다. 파일이 LOAD DATA 함께로드   사용됩니다.

 

- LOW_PRIORITY | CONCURRENT | LOCAL

LOW_PRIORITY 옵션을 사용하면 다른 클라이언트가 테이블에서 읽을 때까지 LOAD DATA 문의 실행이 지연됩니다. 이는 테이블 레벨 잠금  사용하는 스토리지 엔진 ( : MyISAM, MEMORY  MERGE)에만 영향을줍니다.

 

동시 인서트 조건 (중간에 사용 가능한 블록이 없음) 충족시키는 MyISAM 테이블과 함께 CONCURRENT 옵션을 지정하면 LOAD DATA 실행되는 동안 다른 스레드가 테이블에서 데이터를 검색   있습니다.  수정자는 다른 스레드가 테이블을 동시에 사용하지 않더라도 LOAD DATA 성능에 약간 영향을줍니다.

 

LOCAL 옵션은 원격 클라이언트에서 로드를 할때 사용합니다. 서버 환경설정에서 사용을 막으면 원격 클라이언트에서 사용이 불가능합니다.

 

- 중복키 처리

REPLACE  IGNORE 수정자는 고유  값에서 기존 행을 복제하는 입력  처리를 제어합니다.

 

REPLACE 지정하면 입력 행이 기존 행을 대체합니다. , 기본  또는 고유 인덱스에 대해 기존 행과 동일한 값을 갖는 행입니다

 

IGNORE 지정하면 고유  값에서 기존 행을 복제하는 행이 삭제됩니다.

 

수정자를 지정하지 않으면 LOCAL 수정자가 지정되었는지 여부에 따라 동작이 달라집니다. LOCAL 없으면 중복  값이 발견되면 오류가 발생하고 나머지 텍스트 파일은 무시됩니다. LOCAL 사용하면 기본 동작은 IGNORE 지정된 경우와 동일합니다. 서버가 작업 중에 파일 전송을 중지  방법이 없기 때문입니다.

 

- Index Handling

로드 조작  외래  제한 조건을 무시하려면 LOAD DATA 실행하기 전에 SET foreign_key_checks = 0 문을 실행하면 유용합니다.

 

▶ FIELDS  LINES 옵션 설명 그리고 예제들.

- FIELDS

TERMINATED BY : 필드 구분자

ENCLOSED BY : 필드를 구분지을  있는 시작과  문자. '문자' -> 싱글쿼테이션(') 의미

OPTIONALLY ENCLOSED BY : 필요할경우 필요한 구분자를  추가 

FIELDS ESCAPED BY : 필드를 빠져나올  있는 구분자. 예를 들어 데이터에 빈값이 들어있다면  필드를 빠져나올  있는 방법이 있어야 합니다. 그렇지 않으면 컬럼 갯수 대비 데이터가 맞지 않거나, 순서가 틀리거나 어긋날  있습니다. FIELDS ECAPED BY 필드가 비어있는 경우, FIELDS ENCLOSED BY 또는 LINES TERMINATED BY 필드 뒤에 FIELDS TERMINATED BY 값이 포함  필드 값으로 인해 LOAD DATA INFILE 필드 또는  읽기를 너무 일찍 중지합니다. LOAD DATA INFILE 필드 또는  값이 끝나는 위치를 제대로 결정할  없기 때문에 발생합니다.

기본적으로 Escaped by 데이터에 필요하지 않은 데이터에 나타나는 문자를 기준으로 열을 이스케이프하는  사용됩니다.

 

- LINES

   [STARTING BY 'string']

   [TERMINATED BY 'string']

STARTING BY : 데이터 로드를 시작할 구분자. kim 이라면 kim으로 시작하는 문자를 건너뛰고  다음 필드부터 데이터 로드 시작합니다.

TERMINATED BY : 라인() 구분합니다.

 

- Load data 기본문법

LOAD DATA INFILE  입력  덤프파일이 있는 디렉토리  파일명을 입력  줍니다. 그리고  덤프를 어디 테이블에 적재할지 입력합니다(INTO TABLE table1). 데이터를 적재할  덤프파일이 구성되어 있는 방법대로 데이터 컬럼을 분해합니다. 그리고 데이터를 적재합니다.

LOAD DATA INFILE 'data.txt' INTO TABLE table1;

 

- Load data 기본 옵션

select outfile이나 load data 아무런 옵션도 표현하지 않으면 다음과 같은 기본 옵션이 적용됩니다.

FIELDS TERMINATED BY '\t' ENCLOSED BY ''(쌍따옴표아님. 아무값도 없는걸 의미) ESCAPED BY '\\'

LINES TERMINATED BY '\n' STARTING BY ''

그래서   처음 소개했던 데이터 유형을 보면  방법으로 출력되었다는것을 알수 있습니다.

 

 슬래시는 SQL 문에서 문자열 내의 MySQL 이스케이프 문자입니다. 따라서 리터럴  슬래시를 지정하려면 값이 단일  슬래시로 해석되도록  개의  슬래시를 지정해야합니다. 이스케이프 시퀀스 '\ t' '\ n' 각각 탭과  바꿈 문자를 지정합니다.

 

- Load data Fields 처리 기본사항.

새로운 라인들에서 라인의 끝을 찾습니다.

어떠한 라인 접두어도 그냥 넘어가지 않습니다.

라인들에서 탭으로 시작하는 곳에서 필드로 나눕니다.

쌍따옴표 부호로 필드를 묶지 않습니다.

이스케이프 문자 \  앞에 오는 문자를 이스케이프 시퀀스로 해석합니다. 예를 들어, \t, \n  \\ 각각 ,  바꿈   슬래시를 나타냅니다.

 

- Filed 옵션 예제

다음과 같은 데이터를 가지고 있는 파일이 /tmp/exam1.txt 있다고 가정합니다.

Test1    1

Test2    2

Test3    3

 

이것을 로드하는 방법은 다음과 같습니다.

mysql > LOAD DATA INFILE '/tmp/exam1.txt' INTO TABLE exam1;

가장 기본적인 로드 방법으로 field옵션을 써서 사용하지는 않습니다.

테이블의 컬럼 갯수와 일치하면 자동으로 맞게 입력이 됩니다.

 

모든 입력 행에 무시하려는 공통 접두사가있는 경우 LINES STARTING BY 'prefix_string' 사용하여  두부   이전의 항목을 건너   있습니다. 행에 접두사가 포함되어 있지 않으면 전체 행을 건너 뜁니다. 먼저 다음과 같은 데이터를 가지고 있는 파일이 /tmp/test.txt 위치에 저장있다고 가정합니다.

xxx"abc",1

something xxx"def",2

"ghi",3

 

"abc",1 "def",2 만을 테이블에 로드하고 싶습니다.

이를 로드하는 방법은 다음과 같습니다.

mysql > LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test

  FIELDS TERMINATED BY ','  LINES STARTING BY 'xxx';

필드 옵션을 써서  필드 종료자를 ‘,’, 라인 시작을 ‘xxx’ 했기 때문입니다.

 라인 시작에서 xxx 시작하는 곳부터 데이터를 로드하기 시작하는데(starting by) xxx 시작되는 라인은 위에서 2개의 라인밖에 없기 때문입니다.

 

위의 데이터에서 특정 라인을 무시하고 싶다면 다음과 같이 입력합니다.

LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;

 

LOAD DATA 함께 SELECT ... INTO OUTFILE 사용하여 데이터베이스에서 파일로 데이터를  다음 나중에 데이터베이스로 파일을 다시 읽을   명령문의 필드  라인 처리 옵션이 일치해야합니다. 그렇지 않으면 LOAD DATA 파일 내용을 올바르게 해석하지 않습니다. SELECT ... INTO OUTFILE 사용하여 쉼표로 구분  필드가있는 파일을 작성한다고 가정합니다.

SELECT * INTO OUTFILE 'data.txt'

  FIELDS TERMINATED BY ','

  FROM table2;

 

콤마 구분자로  파일을 읽을때 다음과 같이 입력합니다.

LOAD DATA INFILE 'data.txt' INTO TABLE table2

  FIELDS TERMINATED BY ',';

 

LOAD DATA 외부 소스에서 얻은 파일을 읽는  사용할  있습니다. 예를 들어, 많은 프로그램은 CSV (쉼표로 구분  ) 형식으로 데이터를 내보낼  있습니다. 이렇게하면 행에 쉼표로 구분되고  따옴표로 묶인 필드에  이름의 처음 행이 있습니다. 이러한 파일의 행이 캐리지 리턴 /  바꾸기 쌍으로 종료되는 경우 여기에 표시된 명령문은 파일을로드하는  사용할 필드   처리 옵션을 보여줍니다.

 

LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name

  FIELDS TERMINATED BY ',' ENCLOSED BY '"'

  LINES TERMINATED BY '\r\n'

  IGNORE 1 LINES;

 

입력 값이 반드시 인용 부호로 묶여 있지 않은 경우 ENCLOSED BY 옵션 앞에 OPTIONALLY 사용합니다.

 

필드 또는 라인 처리 옵션은  문자열 (' ') 지정할  있습니다. 비어 있지 않으면 FIELDS [OPTIONALLY] ENCLOSED BY  FIELDS ECAPED BY 값은 단일 문자여야 합니다. FIELDS TERMINATED BY, LINES STARTING BY  LINES TERMINATED BY 값은  이상의 문자   있습니다. 예를 들어, 캐리지 리턴/ 바꿈이 쌍으로 종료되는 라인을 쓰거나 그러한 라인이 포함  파일을 읽으려면 LINES TERMINATED BY '\r\n'절을 지정하세요.

 

%% 구성된 행으로 구분  joke 포함  파일을 읽으려면 다음을 수행합니다.

CREATE TABLE jokes

  (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

  joke TEXT NOT NULL);

LOAD DATA INFILE '/tmp/jokes.txt' INTO TABLE jokes

  FIELDS TERMINATED BY ''

  LINES TERMINATED BY '\n%%\n' (joke);

 

필드 [OPTIONALLY] ENCLOSED BY 필드 인용을 제어합니다. 출력 (SELECT ... INTO OUTFILE) 경우 OPTIONALLY 단어를 생략하면 모든 필드가 ENCLOSED BY 문자로 묶입니다. 이러한 출력의  (필드 구분 기호로 쉼표 사용) 다음과 같습니다.

"1","a string","100.20"

"2","a string containing a , comma","102.20"

"3","a string containing a \" quote","102.20"

"4","a string containing a \", quote and comma","102.20"

 

OPTIONALLY 지정하면 ENCLOSED BY 문자는 문자열 데이터 유형 ( : CHAR, BINARY, TEXT 또는 ENUM)이있는 열의 값을 묶는 데만 사용됩니다.

1,"a string",100.20

2,"a string containing a , comma",102.20

3,"a string containing a \" quote",102.20

4,"a string containing a \", quote and comma",102.20

 

필드  내에 ENCLOSED BY 문자가 발생하면 ESCAPED BY 문자가 접두사로 이스케이프됩니다. 또한 비어있는 ESCAPED BY 값을 지정하면 LOAD DATA에서 제대로 읽을 수없는 출력을 실수로 생성   있습니다. 예를 들어, 이스케이프 문자가 비어 있으면 방금 표시된 위의 출력이 다음과 같이 나타납니다.  번째 줄의  번째 필드에는 따옴표 뒤에 쉼표가 포함되어 있습니다.

1,"a string",100.20

2,"a string containing a , comma",102.20

3,"a string containing a " quote",102.20

4,"a string containing a ", quote and comma",102.20

 

입력의 경우 ENCLOSED BY 문자 (있는 경우) 필드  끝에서 제거됩니다. (이것은 OPTIONALLY 지정되었는지 여부에 관계없이 적용됩니다. OPTIONALLY 입력 해석에 영향을주지 않습니다.) 앞에 오는 ENBYD BY 문자의 발생은 현재 필드 값의 일부로 해석됩니다.

 

필드가 ENCLOSED BY 문자로 시작하면 해당 문자의 인스턴스는 필드 또는  TERMINATED BY 순서가 뒤에 오는 경우에만 필드 값을 종료하는 것으로 인식됩니다. 모호성을 피하기 위해 필드  내에서 ENCLOSED BY 문자의 발생을  배로 늘릴  있으며 문자의 단일 인스턴스로 해석됩니다. 예를 들어 ENCLOSED BY ' "' 지정하면 다음과 같이 따옴표가 처리됩니다.

"The ""BIG"" boss"  -> The "BIG" boss

The "BIG" boss      -> The "BIG" boss

The ""BIG"" boss    -> The ""BIG"" boss

 

FIELDS ECAPED BY 특수 문자를 읽거나 쓰는 방법을 제어합니다.

- 입력의 경우 FIELDS ESCAPED BY 문자가 비어 있지 않으면 해당 문자의 발생이 제거되고 다음 문자는 문자 그대로 필드 값의 일부로 사용됩니다.  문자가 이스케이프 문자  예외  일부  문자 시퀀스.  순서는 다음 표에 나와 있습니다 (이스케이프 문자에 \ 사용). NULL 처리 규칙은이 섹션의 뒷부분에서 설명합니다.

Character Escape Sequence

\0 An ASCII NUL (X'00') character

\b A backspace character

\n A newline (linefeed) character

\r A carriage return character

\t A tab character.

\Z ASCII 26 (Control+Z)

\N NULL

FIELDS ESCAPED BY 문자가 비어 있으면 이스케이프 시퀀스 해석이 발생하지 않습니다.

 

출력의 경우, FIELDS ESCAPED BY 문자가 비어 있지 않은 경우 출력에서 ​​다음 문자를 접두어로 사용합니다.

 1. FIELDS ECAPED BY 문자.

 2. 필드 [OPTIONALLY] 문자로 묶여 있습니다.

 - ENCLOSED BY 문자가 비어 있거나 지정되지 않은 경우 FIELDS TERMINATED BY  LINES TERMINATED BY 값의  문자입니다.

 3. ASCII 0 (이스케이프 문자 다음에 실제로 쓰여지는 것은 0  바이트가 아닌 ASCII 0입니다).

 

FIELDS ESCAPED BY 문자가 비어 있으면 문자가 이스케이프되지 않고 \ N 아닌 NULL NULL 출력됩니다. 특히 데이터의 필드 값에 방금 제공된 목록의 문자가 포함  경우  이스케이프 문자를 지정하는 것은 좋지 않습니다.

 

경우에 따라 필드  라인 처리 옵션이 상호 작용합니다.

1. LINES TERMINATED BY  문자열이고 FIELDS TERMINATED BY 비어 있지 않으면 행도 FIELDS TERMINATED BY 종료됩니다.

2. FIELDS TERMINATED BY  FIELDS ENCLOSED BY 값이 모두 비어있는 경우 ( '') 고정  (구분되지 않은) 형식이 사용됩니다. 고정  형식을 사용하면 필드 사이에 구분 기호가 사용되지 않습니다 (,  종결자를 사용할 수는 있음). 대신, 필드의 모든 값을 보유  수있을만큼 넓은 필드 너비를 사용하여  값을 읽고 씁니다. TINYINT, SMALLINT, MEDIUMINT, INT  BIGINT 경우 선언  디스플레이 너비에 관계없이 필드 너비는 각각 4, 6, 8, 11  20입니다.

3. LINES TERMINATED BY 여전히 줄을 구분하는  사용됩니다. 행에 모든 필드가 포함되지 않은 경우 나머지 열은 기본값으로 설정됩니다.  종결자가없는 경우 이것을 ''  설정해야합니다.  경우 텍스트 파일에는  행의 모든 ​​필드가 포함되어야합니다.

4. 고정  형식은 나중에 설명하는 것처럼 NULL  처리에도 영향을줍니다.

 

NULL  처리는 사용중인 FIELDS  LINES 옵션에 따라 다릅니다.

1. 기본 FIELDS  LINES 값의 경우 출력의 경우 필드  \ N으로 NULL 작성되고 입력의 경우 \ N 필드 값이 NULL 읽힙니다 (ESCAPED BY 문자가 \  경우).

2. FIELDS ENCLOSED BY 비어 있지 않으면 리터럴 단어 NULL 값으로 포함하는 필드를 NULL 값으로 읽습니다. 이는 FIELDS ENCLOSED BY 문자로 묶인 NULL 단어와 다르며 문자열 'NULL' 읽습니다.

3. FIELDS ESCAPED BY 비어 있으면 NULL 단어 NULL 작성됩니다.

4. 고정  형식 (FIELDS TERMINATED BY  FIELDS ENCLOSED BY 모두 비어있을  사용됨) 사용하면 NULL  문자열로 작성됩니다. 이로 인해 테이블에 NULL 값과  문자열이 모두  문자열로 기록되므로 파일에   구분할  없게됩니다. 파일을 다시 읽을  둘을 구분할  있어야하는 경우 고정  형식을 사용하지 않아야합니다.

 

NOT NULL 열에 NULL을로드하려고하면 열의 데이터 유형에 대한 내재  기본값과 경고 또는 엄격한 SQL 모드의 오류가 지정됩니다.

 

일부 경우는 LOAD DATA에서 지원되지 않습니다.

1. 고정 크기  (FIELDS TERMINATED BY  FIELDS ENCLOSED BY 비어 있음)  BLOB 또는 TEXT 

2. 접두사와 같거나 다른 접두사를 지정하면 LOAD DATA 입력을 올바르게 해석   없습니다. 예를 들어 다음 FIELDS 절은 문제를 일으킬  있습니다.

   [FIELDS TERMINATED BY '"' ENCLOSED BY '"']

3. FIELDS ESCAPED BY 필드가 비어 있으면 FIELDS ENCLOSED BY 또는 LINES TERMINATED BY 필드와 FIELDS TERMINATED BY 값이 포함  필드 값으로 인해 LOAD DATA 필드 또는  읽기를 너무 일찍 중지합니다. 이는 LOAD DATA 필드 또는  값이 끝나는 위치를 올바르게 결정할  없기 때문에 발생합니다.

 

 컬럼 지정 로드

특정 컬럼을 지정해서 로드하고 싶다면 다음과 같이 합니다.

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata

(col_name 혹은 사용자변수, col_name 혹은 사용자변수);

 

 전처리  데이터 로드

- 특정 컬럼에 값을 처리  로드

LOAD DATA INFILE 'file.txt'

  INTO TABLE t1

  (column1, @var1)

  SET column2 = @var1/100;

 

LOAD DATA INFILE 'file.txt'

  INTO TABLE t1

  (column1, column2)

  SET column3 = CURRENT_TIMESTAMP;

 

- 사용자 변수 컬럼처리  로드

LOAD DATA INFILE 'file.txt'

  INTO TABLE t1

  (column1, @dummy, column2, @dummy, column3); 

 

 

 

참고

: https://myinfrabox.tistory.com/18

저장 프로시저(Stored Procedure)란,

 

SQL Server에서 제공되는 프로그래밍 기능으로,

어떠한 동작을 일괄 처리하기 위한 용도로 사용하는 쿼리문의 집합

프로시저의 생성은 CREATE, 수정은ALTER, 삭제는 DROP, 사용은 EXEC를 사용한다.

CREATE PROCEDURE procedure_name
AS
	실행문;
GO

EXEC procedure_name;

※ 매개변수의 사용

//정의
@입력매개변수 dataType [=default 값]
@출력매개변수 dataType OUTPUT
//실행
EXECUTE procedure_name[전달 값]
EXECUTE procedure_name @변수명 OUTPUT

 

RETURN문을 사용해서 성공 실패 여부를 확인할 수 있다.

저장 프로시저 내 오류처리는 @@ERROR 함수 및 TRY/CATCH문을 이용하여 가능하다.

임시 저장 프로시저를 사용할 때에는 # 또는 ## 을 붙인 형태로 사용하며 TEMPDB에 저장된다.

사용 예)

CREATE PROCEDURE usp_users2
	@userBirth INT,
	@userHeight INT
AS
	SELECT * FROM userTbl WHERE birthYear > @userBirth AND height > @userHeight;
GO
EXEC usp_users2 1970, 178;

저장 프로시저의 특징

 

- SQL Server의 성능을 향상시킬 수 있다.

동일한 저장 프로시저가 자주 사용될 경우에는 일반 쿼리를 반복해서 실행하는 것 보다 SQL Server의 성능이 크게 향상될 수 있다.

 

- 모듈식 프로그래밍이 가능하다.

저장 프로시저를 생성해 놓으면, 언제든지 실행이 가능하다.

 

- 보안을 강화할 수 있다.

사용자 별로 테이블에 접근 권한을 주지 않고, 저장 프로시저에 접근 권한을 줌으로써 좀 더 보안을 강화한다.

 

- 네트워크 전송량을 감소시킨다.

저장 프로시저 이름 및 매개변수 등 몇 글자의 텍스트만 전송하면 되기 때문에 네트워크 부하를 줄일 수 있다.

저장 프로시저는 사용자 정의 프로시저와 확장 저장 프로시저로 크게 나눠볼 수 있다.

우리가 일반적으로 사용하는 사용자 정의 프로시저는 T-SQL 프로시저 이다.

※ 시스템 저장 프로시저란,

시스템을 관리하기 위해서 SQL Server가 제공해주는 저장 프로시저로, SQL Server의 관리와 관련된 작업을 위해서 주로 사용한다.

주로 'sp_' 접두어를 사용하여 작성되어있다.

저장 프로시저의 작동 방식

저장 프로시저 1회 실행 시 작동은 다음과 같이 이루어진다.

만약 동일한 프로시저를 다시 실행시키면 메모리에 남아있던 실행계획을 확인하여 바로 실행하게 되어 소요시간이 훨씬 짧아진다.

 

WITH RECOMPILE 옵션과 문제점

 

※ 저장 프로시저의 문제점과 해결책

처음 수행 시 최적화가 이루어지기 때문에, 두 번째 수행 시에는 그 최적화가 더 안 좋은 성능을 내더라도 이미 컴파일 된 저장 프로시저를 계속 사용하게 된다.

따라서 이에 대한 해결책으로는 재컴파일하는 방법이 있다.

※ 재 컴파일 방법

실행 시에 WITH RECOMPILE 옵션을 사용

실행 시마다 자동으로 다시 컴파일 되도록 프로시저를 생성

'sp_recompile 테이블_이름' 시스템 저장 프로시저를 사용한다.

'DBCC FREEPROCCACHE'를 사용한다.

CREATE PROC usp_id
	@id INT
WITH RECOMPILE
AS
	SELECT * FROM spTbl WHRER CustomerID < @id;
GO

 

사용자 정의 함수

 

저장 프로시저와 조금 비슷해보이지만, 일반적인 프로그래밍 언어에서 사용되는 함수와 같이 복잡한 프로그래밍이 가능

함수는 RETURN 문에 의해서 특정 값을 반환함.

저장 프로시저는 EXEC에 의해서 실행되지만, 함수는 주로 SELECT문에 포함되어 실행됨 (예외도 있음)

CREATE FUNCTION ufn_getAge(@byear INT) -- 매개 변수를 정수로 받음
	RETURNS INT -- 리턴값은 정수형
AS
	BEGIN
		DECLARE @age INT
		SET @age = YEAR(GETDATE()) - @byear
		RETURN(@age)
	END
GO

SELECT dbo.ufn_getAge(1979); -- 호출 시 스키마명을 붙여줘야 함

※ 함수의 종류

 

기본 제공 함수

: SQL Server가 제공해주는 시스템 함수

 

사용자 정의 스칼라 함수

: Return문에 의해서 하나의 값을 돌려주는 함수

 

사용자 정의 테이블 반환 함수

: 리턴하는 값이 테이블인 함수

 

1) 인라인 테이블 함수 - 간단한 테이블을 리턴하는 함수로 뷰(view)와 비슷

CREATE FUNCTION funcName(매개변수)
	RETURNS TABLE
AS
	RETURN (단일 SELECT문;)

 

2) 다중문 테이블 함수 - BEGIN~END로 정의되며 내부에 일련의 T-SQL을 이용해서 반환될 테이블에 행 값을 INSERT하는 형식

CREATE FUNCTION funcName(매개변수)
	RETURNS @TABLE_variable TABLE
		(column dataType 정의)
AS
	BEGIN
		헤더에서 정의한 테이블에 행을 INSERT하는 SQL문.. ;
		RETURN;
	END

스키마 바운드 함수

 

: 함수에서 참조하는 테이블, 뷰 등이 수정되지 못하도록 설정한 함수

스키마 바운드 함수 생성은 옵션에 'WITH SCHEMABINDING'을 사용한다.

 

테이블 변수

 

: 일반적인 변수의 선언처럼 테이블 변수도 선언해서 사용 가능

테이블 변수의 용도는 주로 임시테이블의 용도와 비슷하다

 

사용자 정의 함수의 제약사항

 

: 사용자 정의 함수 내부에 TRY~CATCH문을 사용할 수 없다.

사용자 정의 함수 내부에 CREATE/ALTER/DROP은 사용할 수 없다.

오류가 발생하면 즉시 함수의 실행이 멈추고 값을 반환하지 않는다.

 

 

 

참고

: https://blog.naver.com/leejjoo112/222138998780

 

 

 

 

SQL Stored Procedures for SQL Server

 

What is a Stored Procedure?

A stored procedure is a prepared SQL code that you can save, so the code can be reused over and over again.

So if you have an SQL query that you write over and over again, save it as a stored procedure, and then just call it to execute it.

You can also pass parameters to a stored procedure, so that the stored procedure can act based on the parameter value(s) that is passed.

 

Stored Procedure Syntax

CREATE PROCEDURE procedure_name
AS
sql_statement
GO;

 

Execute a Stored Procedure

EXEC procedure_name;

 

Demo Database

Below is a selection from the "Customers" table in the Northwind sample database:

 

 

CustomerID            CustomerName ContactName   Address City PostalCode           Country    
1

Alfreds Futterkiste Maria Anders               Obere Str. 57 Berlin 12209 Germany      
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222       México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno                 Mataderos 2312 México D.F. 05023 Mexico
4

Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
5 Berglunds snabbköp Christina Berglund Berguvsvägen 8 Luleå S-958 22 Sweden

 

Stored Procedure Example

The following SQL statement creates a stored procedure named "SelectAllCustomers" that selects all records from the "Customers" table:

 

Example

CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;

 

Execute the stored procedure above as follows:

Example

EXEC SelectAllCustomers;

 

Stored Procedure With One Parameter

The following SQL statement creates a stored procedure that selects Customers from a particular City from the "Customers" table:

 

Example

CREATE PROCEDURE SelectAllCustomers @City nvarchar(30)
AS
SELECT * FROM Customers WHERE City = @City
GO;

 

Execute the stored procedure above as follows:

 

Example

EXEC SelectAllCustomers @City = 'London';

 

Stored Procedure With Multiple Parameters

Setting up multiple parameters is very easy. Just list each parameter and the data type separated by a comma as shown below.

The following SQL statement creates a stored procedure that selects Customers from a particular City with a particular PostalCode from the "Customers" table:

 

Example

CREATE PROCEDURE SelectAllCustomers @City nvarchar(30), @PostalCode nvarchar(10)
AS
SELECT * FROM Customers WHERE City = @City AND PostalCode = @PostalCode
GO;

 

Execute the stored procedure above as follows:

 

Example

EXEC SelectAllCustomers @City = 'London', @PostalCode = 'WA1 1DP';

 

 

참고

: https://www.w3schools.com/SQL/sql_stored_procedures.asp

+ Recent posts