CSV → SQL 변환기
CSV를 SQL INSERT 문으로 변환하고 CREATE TABLE도 추가할 수 있습니다. MySQL, PostgreSQL, SQLite 지원. 앞자리 0 유지, MySQL 백슬래시 이스케이프, 따옴표 필드와 NULL 처리.
- 브라우저에서 처리
- 데이터가 브라우저 밖으로 나가지 않습니다
- 무료 · 회원가입 불필요
WeChat으로 스캔하여 공유
예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.
값을 쓰는 방식
- 빈 필드는
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 데이터는 전송되지 않습니다.