엑셀 CSV 데이터 넣기: MySQL·PostgreSQL 가져오기와 오류 대응

엑셀 데이터는 먼저 CSV UTF-8 형식으로 저장한 뒤, MySQL에서는 LOAD DATA 문으로, PostgreSQL에서는 COPY 문으로 표에 넣습니다. 불러오기 전에는 첫 줄 헤더, 날짜 형식, 빈 칸 처리 방식을 정하고, 불러온 뒤에는 행 수와 빈 값 여부를 조회로 확인하는 것이 안전합니다.

  • 엑셀에서는 'CSV UTF-8(쉼표로 분리)'로 저장해야 한글 깨짐을 줄일 수 있습니다.
  • MySQL의 LOAD DATA는 FIELDS TERMINATED BY와 IGNORE 1 LINES로 구분자와 헤더를 지정합니다.
  • PostgreSQL의 COPY는 FORMAT csv와 HEADER true를 쓰며, 내 PC 파일은 psql의 \copy로 처리할 수 있습니다.
  • 불러온 뒤 COUNT(*)와 IS NULL 조회로 행 수와 빈 값을 확인하면 오류를 빨리 찾을 수 있습니다.

엑셀 CSV 데이터를 넣기 전에 정할 세 가지

엑셀 파일은 그대로 데이터베이스(DB)에 넣을 수 없습니다. 먼저 CSV(쉼표로 나눈 텍스트 파일)로 저장한 뒤 표 구조에 맞춰 불러와야 합니다. 이때 첫 줄(헤더), 날짜 형식, 빈 칸을 어떻게 다룰지 미리 정해 두면 시행착오를 줄일 수 있습니다.

엑셀 CSV 데이터의 핵심 내용을 시각적으로 설명하는 이미지
엑셀 CSV 데이터를 DB에 넣기 전 준비 순서와 결과 확인 흐름

저장할 때는 인코딩(글자를 컴퓨터가 읽는 숫자로 바꾸는 규칙)을 확인해 보세요. 엑셀에서 그냥 'CSV'를 고르면 한글이 깨질 수 있으므로 'CSV UTF-8(쉼표로 분리)'를 고르는 편이 안전합니다. 저장한 뒤 메모장에서 첫 줄과 한글 값이 제대로 보이는지 확인해 주세요.

  • 첫 줄에는 열 이름만 두고, 합계나 요약 행은 넣지 않습니다.
  • 날짜는 2026-09-30처럼 한 가지 형식으로 통일합니다.
  • 값 안에 쉼표가 있으면 큰따옴표로 감싸 열이 밀리지 않게 합니다.
  • 빈 칸은 비워 둘지, 값 없음(NULL)으로 넣을지 미리 정합니다.

엑셀에서는 전화번호나 우편번호 앞의 0이 사라지거나, 날짜가 45800 같은 숫자로 보일 때가 있습니다. CSV로 저장하기 전에 해당 열을 텍스트로 바꾸고 날짜를 다시 입력해 두면 이런 문제를 줄일 수 있습니다.

MySQL에서 엑셀 CSV 데이터 불러오기

MySQL 8.0에서는 LOAD DATA 문으로 CSV 파일을 표에 넣습니다. 아래 표 이름과 열 이름은 예시이므로 실제 환경에 맞게 바꿔 주세요. 명령을 실행하기 전에는 대상 표가 비어 있는지와 백업 여부를 먼저 확인해 주세요.

CREATE TABLE sales (
  id INT,
  sale_date DATE,
  amount INT
);

LOAD DATA INFILE '/tmp/sales.csv'
INTO TABLE sales
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

IGNORE 1 LINES는 첫 줄(열 이름)을 건너뛰라는 뜻입니다. 윈도우에서 만든 CSV는 줄 끝이 \r\n이므로 위처럼 지정해 주세요. 실행이 끝나면 Records: 0 Deleted: 0 Skipped: 0 Warnings: 0 형태의 요약이 표시됩니다. Records 값이 파일의 데이터 줄 수와 같은지 확인해 보세요.

서버에 있는 파일을 읽을 때는 FILE 권한과 secure_file_priv 설정이 필요합니다. 내 PC의 파일을 넣으려면 LOAD DATA LOCAL INFILE을 쓰지만, 이 기능은 서버가 허용할 때만 동작합니다.

PostgreSQL에서 엑셀 CSV 데이터 불러오기

PostgreSQL에서는 COPY 문으로 CSV를 넣습니다. 파일을 서버가 직접 읽으므로 서버에서 접근할 수 있는 경로에 두어야 합니다. 내 PC 파일이라면 psql에서 \copy를 사용하면 됩니다.

COPY sales (id, sale_date, amount)
FROM '/tmp/sales.csv'
WITH (FORMAT csv, HEADER true);

HEADER true는 첫 줄을 건너뛰라는 뜻입니다. CSV에서는 따옴표가 없는 빈 값이 NULL(값 없음)로 들어가고, 큰따옴표로 감싼 빈 값은 빈 글자로 들어갑니다. 헷갈린다면 불러온 뒤 조회로 직접 확인해 보세요.

불러온 뒤 확인하고 실패했을 때 되돌리기

불러오기가 끝나면 행 수부터 세어 보세요. 파일의 데이터 줄 수와 표의 행 수가 다르면 중간에 오류가 났거나 헤더를 잘못 처리했을 가능성이 있습니다.

  • SELECT COUNT(*) FROM sales; 로 전체 행 수를 확인합니다.
  • SELECT * FROM sales WHERE amount IS NULL; 로 빈 칸이 들어간 행을 찾습니다.
  • 데이터를 지우거나 고치기 전에는 백업하고, WHERE 조건을 SELECT로 먼저 확인합니다.
  • MySQL InnoDB 표나 PostgreSQL에서는 BEGIN으로 트랜잭션을 열고 결과가 맞으면 COMMIT, 아니면 ROLLBACK으로 되돌릴 수 있습니다.

명령문이 부담스럽다면 DBeaver 같은 DB 도구의 가져오기 기능도 선택지가 됩니다. 다만 화면 이름과 위치는 버전마다 다르니 사용하는 버전의 안내를 함께 확인해 주세요.

출처

  1. MySQL 8.0 Reference Manual: LOAD DATA Statement Oracle MySQL · 2026-09-30
  2. PostgreSQL COPY 명령 문서(소스 원문) PostgreSQL Project · 2026-09-30

댓글 남기기