CSV 파일을 열거나 붙여넣고 데이터베이스와 문을 고르면 옵션 옆에 스크립트가 나타납니다. 기본값은 PostgreSQL 트랜잭션으로, TEXT 열로 된 CREATE TABLE IF NOT EXISTS와 100행씩 묶은 INSERT를 쓰므로 00412는 '00412'로 남습니다. 테이블에 숫자, 불리언, DATE 열이 필요하다면 숫자와 true/false 감지를 고르세요. 파일은 업로드되지 않고 브라우저 안에서 변환됩니다.
CSV를 SQL로 변환하는 방법
.csv,.tsv,.txt파일을 열거나 도구 위에 끌어다 놓거나 행을 붙여넣으세요. 구분 기호는 자동으로 감지됩니다. 가져오기 설정에서 구분 기호, 머리글 행, EUC-KR(CP949)이나 Windows-1252 같은 레거시 인코딩을 지정할 수 있습니다.- 데이터베이스로 PostgreSQL, MySQL / MariaDB, SQLite, SQL Server 중 하나를 고르세요. 테이블 이름을 확인하세요. 처음에는 파일 이름에서 공백과 문장 부호를 밑줄로 바꾼 이름입니다(
sales report.csv는sales_report). - 문을 고르고, UPSERT, UPDATE, DELETE라면 행을 식별하는 키 열에 체크하세요.
- 미리 보기를 확인한 다음 복사를 누르거나
.sql파일을 다운로드해 데이터베이스 클라이언트로 실행하세요. 예:psql -f data.sql.
같은 설정으로 여러 파일의 스크립트를 만들려면 일괄 변환: 여러 파일 변환을 고르세요. 파일을 차례로 변환하고 스크립트를 ZIP 하나로 함께 다운로드합니다.
문과 옵션
| INSERT | 여러 행을 담은 INSERT INTO … VALUES 문입니다. INSERT당 행 수로 문 하나에 들어갈 행 수를 정합니다(1~1,000, 기본값 100). SQL Server는 1,000행을 넘으면 거부합니다. |
|---|---|
| UPSERT(삽입 또는 업데이트) | 행마다 문 하나를 써서 행을 삽입하거나, 키가 같은 기존 행을 업데이트합니다. PostgreSQL과 SQLite는 ON CONFLICT (…) DO UPDATE SET … = excluded.…, MySQL은 ON DUPLICATE KEY UPDATE, SQL Server는 MERGE를 씁니다. 대상 테이블의 키 열에 기본 키나 고유 인덱스가 있어야 합니다. |
| UPDATE | 행마다 UPDATE … SET … WHERE key = …를 씁니다. 키 열은 바꾸지 않습니다. 모든 열이 키라면 업데이트할 것이 없으므로 문을 쓰지 않습니다. |
| DELETE | 행마다 DELETE FROM … WHERE key = …를 씁니다. 빈 키 값은 IS NULL이 됩니다. |
| 키 열 | UPSERT, UPDATE, DELETE에 필수입니다. 이 도구는 WHERE 키 없이는 이런 문을 쓰지 않습니다. CREATE TABLE 추가를 켜면 키 열은 NOT NULL이 되고 PRIMARY KEY가 됩니다. |
| CREATE TABLE 추가 | 기본으로 켜져 있습니다. CREATE TABLE IF NOT EXISTS를 씁니다(SQL Server이거나 DROP 뒤라면 그냥 CREATE TABLE). |
| 앞에 DROP TABLE IF EXISTS 추가 | 같은 이름의 기존 테이블을 대체합니다. 기본으로 꺼져 있으며, 스크립트를 실행하면 기존 테이블과 데이터가 사라집니다. |
| 트랜잭션으로 감싸기 | 기본으로 켜져 있습니다: BEGIN; … COMMIT;(MySQL은 START TRANSACTION;, SQL Server는 BEGIN TRANSACTION;). |
| 빈 셀을 NULL로 쓰기 | 기본으로 켜져 있습니다. 끄면 빈 셀을 ''로 씁니다. |
열 유형과 따옴표 처리
모든 값을 텍스트로 유지(기본값)에서는 모든 열이 TEXT(SQL Server는 NVARCHAR(MAX))이고 모든 값을 따옴표로 감싼 문자열 리터럴로 쓰므로, 앞자리 0, 긴 ID, 특이한 날짜도 그대로 들어갑니다.
숫자와 true/false 감지에서는 비어 있지 않은 모든 값이 맞을 때만 열에 유형을 붙입니다.
| 정수 | INTEGER, 9자리를 넘는 값이 있으면 BIGINT입니다. 값은 따옴표 없이 씁니다. 앞자리 0이 있거나 9,007,199,254,740,991을 넘는 숫자가 있으면 그 열은 텍스트로 남습니다. |
|---|---|
| 소수(유효 숫자 15자리 이하) | PostgreSQL은 NUMERIC, MySQL과 SQL Server는 데이터에 맞춰 크기를 정한 DECIMAL(p,s), SQLite는 REAL입니다. 1,5 같은 소수점 쉼표가 있으면 그 열은 텍스트로 남습니다. |
| true / false(대소문자 무관) | PostgreSQL과 MySQL에서는 BOOLEAN 유형에 TRUE/FALSE 값을, SQL Server에서는 BIT 유형에 1/0 값을, SQLite에서는 INTEGER 유형에 1/0 값을 씁니다. |
| YYYY-MM-DD 형식의 날짜 | '2026-03-01'처럼 따옴표로 감싼 값을 쓰는 DATE이며, SQLite에서는 TEXT입니다. 날짜·시간과 그 밖의 날짜 형식은 텍스트로 남습니다. |
- 테이블과 열 이름은 적힌 그대로 인용 부호로 감싸므로 공백, 예약어, 한글 같은 비라틴 이름도 쓸 수 있습니다. PostgreSQL과 SQLite는
"order date", MySQL은 `order date, SQL Server는[order date]`입니다. 이름 안의 인용 부호는 두 번 겹쳐 씁니다. - 값 안의 작은따옴표는 두 번 겹쳐 씁니다(
O'Brien은'O''Brien'). MySQL은 기본적으로\를 이스케이프 문자로 보므로 백슬래시도 두 번 겹쳐 씁니다. SQL Server 리터럴에는 유니코드 텍스트가 유지되도록N접두사를 붙입니다. - 따옴표로 감싼 CSV 값 안의 줄 바꿈은 SQL 문자열 리터럴 안에 그대로 남습니다.
- 대부분의 데이터베이스는 NUL 문자를 저장할 수 없으므로 지우고, 지운 개수를 알려 줍니다.
SQL 스크립트가 실행되지 않을 때
- 스크립트가 전부 열 하나로 나옵니다. 구분 기호를 잘못 추측했습니다. 가져오기 설정에서 지정하고 파일을 다시 여세요.
- 숫자 열이 TEXT로 나왔습니다. 일반 숫자가 아닌 값이 하나 이상 있습니다. 예를 들면
12 kg,1,5,007입니다. CSV 뷰어에서 찾거나 CSV 데이터 정리로 열을 고치세요. - 제약 조건이 없다며 UPSERT가 실패합니다.
ON CONFLICT와ON DUPLICATE KEY는 대상 테이블의 키 열에 기본 키나 고유 인덱스가 있을 때만 동작합니다. 기존 테이블에 인덱스를 추가하거나, CREATE TABLE 추가로 키를 만들게 하세요. - MySQL이나 SQL Server가 PRIMARY KEY를 거부합니다. 텍스트로 남은 키 열은
TEXT(MySQL/MariaDB) 또는NVARCHAR(MAX)(SQL Server)로 만들어지는데, 두 데이터베이스 모두 이런 유형 전체에 인덱스를 걸 수 없습니다.VARCHAR키로 테이블을 직접 만든 뒤 CREATE TABLE 추가를 끄세요. - SQL Server가 테이블이 이미 있다고 합니다. SQL Server 스크립트는 그냥
CREATE TABLE을 씁니다. 기존 테이블에 넣으려면 CREATE TABLE 추가를 끄고, 대체하려면 앞에 DROP TABLE IF EXISTS 추가를 켜세요. - 스크립트가 중간에 멈춥니다. 데이터베이스 오류에 실패한 문이 나옵니다. 대개 키 중복이거나, 기존 테이블의 열 유형에 맞지 않는 값 때문입니다. CSV 검사로 파일을 확인하고 스크립트를 다시 실행하세요.
대용량 파일과 한도
25 MB, 10만 행 또는 200만 셀까지의 파일은 실시간 미리 보기와 함께 열립니다. 더 큰 파일은 스트리밍 방식으로 변환합니다. 미리 보기에는 처음 200행이 나오고, 파일을 조각 단위로 두 번 읽으며(한 번은 열 유형과 너비 파악, 한 번은 스크립트 쓰기), 다운로드에는 모든 행이 들어갑니다. 스크립트 하나는 최대 4 GB입니다.
변환은 이 탭의 백그라운드 워커에서 실행되므로 페이지가 멈추지 않고, 취소로 중단할 수 있습니다. CSV는 서버로 보내지 않습니다. 스크립트 대신 바로 쓸 수 있는 데이터베이스 파일이 필요하면 CSV를 SQLite로를 사용하세요.
예시: 고객 목록을 PostgreSQL INSERT 문으로
앞자리 0이 있는 ID, 아포스트로피와 쉼표가 들어간 이름, 비어 있는 요금제가 있는 고객 목록을 기본 설정과 테이블 이름 customers로 변환한 결과입니다. 숫자와 true/false 감지를 켜면 signup_date는 DATE, monthly_fee는 따옴표 없는 29.00을 쓰는 NUMERIC, active는 TRUE/FALSE를 쓰는 BOOLEAN이 되고, customer_id는 TEXT로 남습니다.
customer_id,name,signup_date,plan,monthly_fee,active 00412,"O'Brien, Kate",2026-03-01,pro,29.00,true 00413,Luis Ortega,2026-03-04,,0,false
BEGIN;
CREATE TABLE IF NOT EXISTS "customers" (
"customer_id" TEXT,
"name" TEXT,
"signup_date" TEXT,
"plan" TEXT,
"monthly_fee" TEXT,
"active" TEXT
);
INSERT INTO "customers" ("customer_id", "name", "signup_date", "plan", "monthly_fee", "active") VALUES
('00412', 'O''Brien, Kate', '2026-03-01', 'pro', '29.00', 'true'),
('00413', 'Luis Ortega', '2026-03-04', NULL, '0', 'false');
COMMIT;자주 묻는 질문
기본 설정에서 모든 열이 TEXT인 이유는 무엇인가요?
CSV에는 유형이 없고, 유형을 잘못 추측하면 데이터가 사라지기 때문입니다. 00412 같은 ID를 정수로 저장하면 412가 됩니다. 텍스트로 넣으면 파일 내용이 정확히 그대로 들어갑니다. 숫자, 불리언, DATE 열이 필요하면 숫자와 true/false 감지를 고르세요.
어떤 데이터베이스에서 스크립트를 실행할 수 있나요?
PostgreSQL, MySQL과 MariaDB, SQLite, SQL Server입니다. 데이터베이스마다 식별자 인용 방식, 문자열 이스케이프, 불리언 값, UPSERT 문법이 다릅니다. 다운로드하기 전에 맞는 데이터베이스를 고르세요. 한 데이터베이스용 스크립트는 다른 데이터베이스에서 그대로 쓸 수 없습니다.
INSERT 대신 COPY나 LOAD DATA 명령을 만들 수 있나요?
안 됩니다. 스크립트는 표준 INSERT, UPSERT, UPDATE, DELETE 문을 씁니다. 아주 큰 데이터를 넣을 때는 PostgreSQL의 COPY나 MySQL의 LOAD DATA처럼 CSV를 직접 읽는 데이터베이스 자체의 대량 적재 기능을 검토하세요.