CSV → SQL 변환기

CSV를 SQL INSERT 문으로 변환하고 CREATE TABLE도 추가할 수 있습니다. MySQL, PostgreSQL, SQLite 지원. 앞자리 0 유지, MySQL 백슬래시 이스케이프, 따옴표 필드와 NULL 처리.

  • 브라우저에서 처리
  • 데이터가 브라우저 밖으로 나가지 않습니다
  • 무료 · 회원가입 불필요
MySQL, PostgreSQL 또는 SQLite의 따옴표 규칙과 CREATE TABLE 자료형을 선택합니다. 변경하면 현재 CSV를 바로 변환합니다. MySQL은 문자열 값의 백슬래시도 두 개로 씁니다.
기본 테이블명은 my_table이며 비워도 이 이름을 사용합니다. 전체 이름을 하나의 식별자로 따옴표로 감쌉니다. 편집을 멈춘 뒤 0.3초 후 출력을 갱신합니다.
배치 INSERT는 한 문장에 여러 행을 쓰고 개별 INSERT는 데이터 행마다 한 문장을 씁니다. 모드를 바꾸면 현재 CSV를 바로 변환합니다.
INSERT 앞에 CREATE TABLE을 추가합니다. 열 값에서 자료형을 추론하며 키나 제약 조건은 추가하지 않습니다. SQL 실행 전에 자료형을 검토하세요.
UTF-8 CSV 파일을 CSV 입력에 불러오고 현재 옵션으로 변환합니다. 파일은 이 브라우저에서 읽으며 CSV 데이터는 업로드하지 않습니다.
헤더와 데이터 행이 있는 쉼표 구분 CSV를 붙여 넣습니다. 입력을 멈춘 뒤 0.3초 후 출력을 갱신합니다. 여분의 셀에는 이름이 있는 열을 추가하고 부족한 셀은 NULL로 씁니다.
생성된 SQL 문 전체를 복사합니다. 선택한 경우 CREATE TABLE도 포함됩니다. 빈 결과는 복사할 수 없습니다.
SQL 문이 여기에 표시됩니다.
예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.

값을 쓰는 방식

  • 빈 필드는 NULL이 됩니다.
  • 비어 있지 않은 셀이 모두 일반 숫자(42, -7, 19.90)인 열은 따옴표 없이 씁니다. 일반 숫자는 앞자리 0, +, 지수가 없고 15자리 이하인 숫자입니다.
  • 그 밖의 열은 숫자까지 모두 따옴표로 감싼 문자열로 쓰므로 02134, 1e5, 20자리 카드 번호도 원래 글자 그대로 남습니다. 대상 열이 숫자 타입이면 MySQL, PostgreSQL, SQLite 모두 따옴표로 감싼 숫자를 변환해 저장합니다.
  • 작은따옴표는 모든 방언에서 두 개로 씁니다(O”Brien). MySQL에서는 백슬래시도 두 개로 씁니다. MySQL 기본 SQL 모드는 문자열 안의 \n을 줄바꿈으로 읽기 때문입니다(MySQL 8.4 Reference Manual, String Literals, 표 11.1). standard_conforming_strings가 켜진 PostgreSQL(9.1부터 기본값, PostgreSQL 4.1.2.1)과 SQLite는 백슬래시를 그대로 저장합니다.
  • 헤더보다 많은 셀에는 column_3, column_4 같은 열을 추가하고 상태 표시줄에 알려 줍니다. 짧은 행은 NULL로 채웁니다.

예시: 따옴표, 앞자리 0, 빈 필드

입력(SQLite, 배치 모드, 테이블명 customers):

id,name,zip,note
1,"O'Brien, Pat",02134,
2,Lee,10001,"path C:\new"
INSERT INTO "customers" ("id", "name", "zip", "note") VALUES
(1, 'O''Brien, Pat', '02134', NULL),
(2, 'Lee', '10001', 'path C:\new');

따옴표로 감싼 “O’Brien, Pat”은 쉼표를 유지하고, 빈 note는 NULL이 됩니다. 02134 때문에 zip 열은 문자열 열이 되어 10001도 따옴표로 감쌉니다. SQLite 3에서 실행하면 SELECT zip FROM customers가 02134와 10001을 돌려줍니다.

같은 입력에서 MySQL을 고르면 백슬래시가 두 개가 되어 저장되는 값은 그대로 path C:\new입니다.

id,name,zip,note
1,"O'Brien, Pat",02134,
2,Lee,10001,"path C:\new"
INSERT INTO `customers` (`id`, `name`, `zip`, `note`) VALUES
(1, 'O''Brien, Pat', '02134', NULL),
(2, 'Lee', '10001', 'path C:\\new');

서버의 sql_mode에 NO_BACKSLASH_ESCAPES가 있으면 백슬래시는 일반 문자입니다. 그런 서버에는 PostgreSQL이나 SQLite 출력을 쓰세요.

예시: CREATE TABLE

CREATE TABLE 추가를 켜면 값에 따라 열 타입을 정합니다. 정수는 INTEGER(MySQL은 INT, 2,147,483,647을 넘으면 BIGINT), 소수점이 있는 숫자는 DOUBLE PRECISION(MySQL은 DOUBLE, SQLite는 REAL), 나머지는 TEXT입니다. PostgreSQL 예:

order_id,amount,paid_at
1001,19.90,2026-09-30
1002,5,
CREATE TABLE "orders" ("order_id" INTEGER, "amount" DOUBLE PRECISION, "paid_at" TEXT);
INSERT INTO "orders" ("order_id", "amount", "paid_at") VALUES
(1001, 19.90, '2026-09-30'),
(1002, 5, NULL);

타입이 중요하면 실행 전에 고치세요. 금액은 NUMERIC / DECIMAL, paid_at 같은 날짜는 DATE나 TIMESTAMP가 맞습니다. 기본 키와 제약 조건은 붙이지 않습니다.

예시: 헤더보다 셀이 많은 행

sku,qty
A-1,3,fragile
B-2,5
INSERT INTO "stock" ("sku", "qty", "column_3") VALUES ('A-1', 3, 'fragile');
INSERT INTO "stock" ("sku", "qty", "column_3") VALUES ('B-2', 5, NULL);

추가된 column_3은 상태 표시줄에 나옵니다. 정식 이름이 필요하면 헤더 행에서 이름을 붙이세요.

제한 사항

  • 구분자는 쉼표만 지원하며 첫 행은 항상 헤더입니다. 세미콜론이나 탭으로 구분된 파일은 먼저 변환하세요.
  • 타입은 글자만 보고 추측합니다. 날짜, 불리언, 1e5는 문자열로 처리합니다.
  • 테이블명과 열 이름은 하나의 식별자로 감싸므로 public.users는 점이 들어간 이름 하나가 됩니다.
  • 큰 파일도 브라우저 탭에서 한 번에 변환합니다. 수백만 행이라면 데이터베이스의 대량 적재 기능(LOAD DATA, COPY, .import)을 쓰세요.

FAQ

이 도구는 무엇을 하나요?

CSV 데이터를 SQL INSERT 문으로 바꾸고, 필요하면 CREATE TABLE 문도 출력합니다. 헤더 행이 열 이름이 되고 각 데이터 행이 값 묶음이 되며, 선택한 방언에 맞게 따옴표로 감싸고 이스케이프합니다.

어떤 SQL 방언을 지원하나요?

MySQL(식별자는 백틱, 문자열의 백슬래시는 두 개로), PostgreSQL과 SQLite(식별자는 큰따옴표, 백슬래시는 그대로)입니다. INSERT 문법은 세 가지 모두 같습니다.

NULL은 어떻게 처리되나요?

빈 필드는 따옴표 없는 NULL이 됩니다. 공백만 있는 필드는 문자열이며 NULL이 아닙니다. 빈 문자열 ''은 만들 수 없습니다.

02134는 따옴표가 붙는데 10001은 안 붙을 때가 있는 이유는?

열의 비어 있지 않은 셀이 모두 일반 숫자(앞자리 0 없음, + 기호나 지수 없음, 15자리 이하)일 때만 그 열을 숫자로 출력합니다. 02134는 일반 숫자가 아니므로 zip 열 전체를 따옴표로 감싸고 앞자리 0이 유지됩니다.

데이터가 서버로 전송되나요?

아니요. 변환은 모두 브라우저의 JavaScript로 처리되며 CSV 데이터는 전송되지 않습니다.