MySQL CSV 파일 넣기 | LOAD DATA LOCAL INFILE 사용법과 오류 체크

MySQL에 CSV 파일을 넣을 때 가장 많이 막히는 포인트는 SQL 문법보다 순서다. 보통은 LOAD DATA LOCAL INFILE 문장만 외우고 바로 실행하려다가 No database selected, table doesn't exist, local_infile disabled 같은 오류를 먼저 만나게 된다. 실제로는 DB 선택 → 테이블 생성 확인 → local infile 확인 → CSV 적재 → 결과 검증 순서로 가야 훨씬 덜 꼬인다.

특히 처음 CSV를 넣을 때는 “CSV만 있으면 바로 들어가겠지”라고 생각하기 쉬운데, MySQL은 먼저 어느 DB에 넣을지, 어느 테이블에 넣을지, 로컬 파일 읽기를 허용하는지가 정리돼 있어야 한다. 이 글에서는 MySQL 기준으로 CSV 파일을 불러오는 전체 흐름과, LOAD DATA LOCAL INFILE 사용법, 그리고 자주 나는 오류를 한 번에 정리한다.

MySQL에서 CSV를 넣는 전체 흐름

CSV 적재는 보통 아래 순서로 진행하면 된다.

  1. MySQL에 local infile 옵션으로 접속한다.
  2. 데이터를 넣을 DB를 만든다.
  3. USE로 현재 DB를 선택한다.
  4. SQL 파일이 있으면 먼저 실행해서 테이블 구조를 만든다.
  5. SHOW TABLES, DESC로 테이블 존재 여부와 컬럼 구조를 확인한다.
  6. LOAD DATA LOCAL INFILE로 CSV를 넣는다.
  7. SELECT ... LIMIT로 실제 적재 결과를 확인한다.

즉 핵심은 CSV를 넣기 전에 테이블 구조부터 준비하는 것이다.

1. MySQL 접속: local infile 옵션부터 확인

CSV 파일을 로컬 경로에서 읽으려면, 접속할 때 --local-infile=1 옵션이 필요한 경우가 있다. 그래서 처음부터 아래처럼 접속하는 게 안전하다.

 /usr/local/mysql/bin/mysql --local-infile=1 -u username -p

여기서 중요한 건 --local-infile=1이다.

이 옵션이 빠져 있으면 LOAD DATA LOCAL INFILE을 실행할 때 로컬 파일 읽기 자체가 막히는 경우가 있다.

접속 후에는 아래 명령으로 현재 local_infile 상태도 확인할 수 있다.

SHOW VARIABLES LIKE 'local_infile';

결과가 ON으로 나오면 로컬 파일 읽기 설정이 켜진 상태고, OFF면 적재 전에 이 설정부터 다시 봐야 한다.

2. DB를 만들고 반드시 선택해야 한다

CSV를 넣기 전에 가장 먼저 해야 할 일은 데이터를 넣을 데이터베이스를 선택하는 것이다.

이 단계를 빠뜨리면 가장 흔하게 나오는 오류가 바로 No database selected다.

기본 흐름은 아래처럼 잡으면 된다.

CREATE DATABASE dbname;
USE dbname;
SELECT DATABASE();

여기서 SELECT DATABASE();는 지금 내가 어떤 DB를 보고 있는지 확인하는 용도다.

생각보다 이걸 안 찍고 진행하다가, 엉뚱한 DB에 넣거나 아예 DB를 선택하지 않은 상태에서 작업하는 경우가 많다.

즉 USE dbname;은 그냥 습관처럼 넣는 게 좋다.

3. SQL 파일이 있으면 CSV보다 먼저 실행한다

CSV를 적재하려면 먼저 테이블이 있어야 한다.

그래서 .sql 파일이 함께 있다면, 보통은 CSV보다 먼저 SQL 파일을 실행해서 테이블 구조를 만들어야 한다.

SOURCE /Users/yourname/Desktop/file.sql;

이 명령은 지정한 SQL 파일 안의 쿼리를 그대로 실행한다.

보통 여기에는 CREATE TABLE 문이 들어 있어서, 이후 CSV를 넣을 대상 테이블이 생성된다.

즉 CSV가 안 들어갈 때는 무조건 LOAD DATA 문부터 보지 말고,

테이블이 먼저 만들어졌는지부터 확인하는 게 맞다.

4. 테이블 존재 여부와 구조를 먼저 확인한다

SQL 파일을 실행했거나, 이미 DB 안에 테이블이 있다고 생각해도 바로 CSV를 넣기보다 먼저 확인하는 게 좋다.

SHOW TABLES;

이 명령으로 현재 DB에 어떤 테이블이 있는지 볼 수 있다.

그리고 대상 테이블 구조는 아래처럼 확인한다.

DESC tablename;

여기서 보는 포인트는 단순히 컬럼 개수만이 아니다.

  • 컬럼 순서가 CSV와 맞는지
  • 자료형이 맞는지
  • NOT NULL 제약이 있는지
  • 헤더를 제외해야 하는 구조인지

즉 CSV 적재 전에 DESC 한 번 보는 것만으로도 오류를 많이 줄일 수 있다.

5. CSV 파일 적재: LOAD DATA LOCAL INFILE 기본 형태

이제 실제로 CSV를 넣는 핵심 구문이다.

LOAD DATA LOCAL INFILE '/경로/filename.csv'
INTO TABLE tablename
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\\n'
IGNORE 1 ROWS;

이 문장에서 가장 중요한 부분만 보면 이렇다.

  • FIELDS TERMINATED BY ',' → 컬럼 구분자가 쉼표라는 뜻
  • ENCLOSED BY '"' → 문자열이 큰따옴표로 감싸져 있을 수 있다는 뜻
  • LINES TERMINATED BY '\\n' → 줄바꿈 단위로 행을 구분
  • IGNORE 1 ROWS → 첫 줄 헤더를 건너뜀

CSV에 헤더가 있다면 IGNORE 1 ROWS를 거의 항상 같이 쓰게 된다.

이걸 빼먹으면 헤더 문자열이 첫 번째 데이터로 들어가면서 자료형 오류가 나거나, 데이터가 어긋날 수 있다.

6. 적재 결과는 바로 확인해야 한다

CSV가 들어갔다고 끝이 아니다.

실제 데이터가 제대로 들어갔는지는 반드시 확인해야 한다.

SELECT *
FROM tablename
LIMIT 10;

이렇게 상위 10개 정도만 확인해도 대충 감이 온다.

  • 컬럼이 한 칸씩 밀리지 않았는지
  • 헤더가 첫 줄로 들어가지 않았는지
  • 한글이 깨지지 않았는지
  • 숫자/문자 컬럼이 예상대로 들어갔는지

즉 LOAD DATA 다음엔 거의 반사적으로 SELECT ... LIMIT 10을 같이 한다고 생각하면 된다.

자주 나는 오류와 해결 방법

CSV 적재는 문법보다 환경/순서 문제로 더 많이 막힌다.

아래 오류는 거의 자주 나오는 편이다.

1) No database selected

이건 현재 사용할 DB를 선택하지 않았다는 뜻이다.

해결은 단순하다.

USE dbname;

그리고 필요하면 아래로 다시 확인한다.

SELECT DATABASE();

2) 테이블이 없다는 오류

이건 CSV보다 먼저 테이블이 준비되지 않았다는 뜻이다.

즉 SQL 파일 실행이나 CREATE TABLE이 먼저 필요하다.

확인은 이렇게 한다.

SHOW TABLES;
DESC tablename;

테이블이 없다면 CSV 구문을 계속 고칠 게 아니라,

먼저 .sql 파일을 SOURCE로 실행해야 한다.

3) local infile 관련 오류

이건 보통 로컬 파일 읽기 허용 설정이 꺼져 있을 때 난다.

확인은 아래처럼 한다.

SHOW VARIABLES LIKE 'local_infile';

그리고 접속할 때는 아예 처음부터 이렇게 들어가는 게 좋다.

 /usr/local/mysql/bin/mysql --local-infile=1 -u username -p

4) 헤더가 데이터로 들어가는 문제

CSV 첫 줄이 컬럼명인데 IGNORE 1 ROWS를 빼먹으면 생긴다.

이건 적재 후 SELECT * LIMIT 10만 해봐도 바로 보인다.

5) 컬럼 수가 안 맞는 문제

CSV 컬럼 개수와 테이블 구조가 다르면 데이터가 밀리거나 오류가 난다.

이럴 땐 DESC tablename;으로 테이블 컬럼 순서를 먼저 보고, CSV 구조와 맞는지 확인해야 한다.

CSV 적재 전에 체크하면 좋은 것

실전에서는 아래 세 가지만 먼저 보면 대부분 덜 막힌다.

현재 DB 선택 여부

SELECT DATABASE();

테이블 존재 여부

SHOW TABLES;

local infile 상태

SHOW VARIABLES LIKE 'local_infile';

즉 CSV 적재는 LOAD DATA LOCAL INFILE 문장만 아는 걸로 끝나는 작업이 아니라,

어디에 넣는지 / 넣을 테이블이 있는지 / 로컬 파일 읽기가 가능한지를 먼저 확인하는 작업이다.

정리

MySQL에서 CSV 파일을 넣을 때 가장 중요한 건 문법보다 작업 순서다.

먼저 local infile 옵션으로 접속하고, DB를 선택하고, 테이블이 있는지 확인한 뒤, LOAD DATA LOCAL INFILE로 적재하고, 마지막으로 결과를 검증해야 한다.

실무에서는 대부분 CSV 적재가 안 되는 이유가 쿼리 문법이 아니라

  • DB를 선택하지 않았거나
  • 테이블이 없거나
  • local_infile이 꺼져 있거나
  • 헤더를 무시하지 않았기 때문인 경우가 많다.

즉 CSV 적재 작업은 LOAD DATA 한 줄보다, 그 전에 무엇을 확인해야 하는지를 같이 알아야 제대로 끝난다.


MySQL에서 CSV를 넣을 때는 LOAD DATA LOCAL INFILE 문장 자체보다 DB 선택 → 테이블 확인 → local infile 확인 → 적재 결과 검증 순서를 먼저 지키는 게 중요하다.