ToolActToolAct

CSV to SQL 변환 도구

CSV 파일을 업로드하거나 데이터를 붙여넣어 SQL INSERT 문으로 변환

CSV 파일을 여기에 드롭하거나 클릭하여 선택

CSV를 SQL로 변환이란?

CSV를 SQL로 변환은 CSV(쉼표로 구분된 값) 형식의 데이터를 SQL INSERT 문으로 변환하여 데이터베이스에 쉽게 가져올 수 있도록 하는 온라인 데이터 형식 변환 도구입니다.

CSV는 스프레드시트와 데이터 내보내기에 널리 사용되는 일반적인 표 형식 데이터입니다. SQL은 관계형 데이터베이스의 표준 쿼리 언어이며, INSERT 문은 데이터베이스 테이블에 데이터를 삽입하는 데 사용됩니다.

이 도구를 사용하면 CSV 데이터를 실행 가능한 SQL 문으로 빠르게 변환할 수 있으며, 사용자 지정 테이블 이름, 필드 이름, 인용 부호 스타일을 지원하여 데이터 마이그레이션 및 가져오기 작업을 용이하게 합니다.

사용 방법

사용 방법

  1. 입력 상자에 CSV 데이터를 붙여넣거나 입력하거나, CSV 파일을 업로드하세요
  2. 테이블 이름을 설정하세요 (기본값: table_name)
  3. 적절한 구분자를 선택하세요 (기본값: 쉼표)
  4. 첫 번째 행을 필드명으로 사용할지 선택하세요
  5. 오른쪽에 SQL INSERT 문이 생성됩니다

가져오기 안전성

  • 실행 전에 생성된 INSERT 문의 테이블 이름, 컬럼 순서, 이스케이핑, NULL 값, 숫자 형식을 검토하세요.
  • 먼저 소량으로 실행해 보고, 데이터베이스가 지원하면 실제 가져오기를 트랜잭션으로 감싸세요.

활용 사례

소규모 CSV 내보내기에서 INSERT 문 생성CSV, TSV, 텍스트 테이블을 업로드하고 구분자를 선택한 뒤 테이블 이름을 설정하면, 헤더 이름 또는 자동 생성된 col1, col2, col3 컬럼을 사용한 SQL INSERT 문을 생성합니다. 파싱과 문장 생성 모두 브라우저에서 실행되므로, psql, mysql, 마이그레이션 도구에 붙여넣기 전까지 가져올 행이 기기를 벗어나지 않습니다.
데이터베이스 스타일에 맞는 식별자 인용 부호 설정MySQL용 백틱, PostgreSQL/표준 SQL용 큰따옴표, 문자열 리터럴용 작은따옴표 간 전환이 가능하며, 선택적으로 VARCHAR(255) 컬럼의 간단한 CREATE TABLE 문을 포함할 수 있습니다. 제어된 중간 단계로 활용한 뒤, 대상 데이터베이스 버전에서 SQL을 검증하세요.
SQL 제한 사항을 확인하며 시드 데이터 준비도구는 작은따옴표와 값 내 이중 따옴표를 이스케이프하고 네 가지 구분자를 지원하며, 데모, 로컬 픽스처, 관리자 수정 초안에 적합하지만, 데이터 타입, 제약 조건, 인덱스, 트랜잭션, COPY, LOAD DATA, 다중 행 VALUES 배칭 같은 데이터베이스별 벌크 로드 구문은 추론하지 않습니다.
공유 데이터베이스 시딩 시 IF NOT EXISTS 가드 추가생성된 INSERT 배치를 BEGIN/COMMIT 트랜잭션으로 감싸거나 수동 DELETE/INSERT 패턴과 결합하면, 개발 및 스테이징 스키마에서 시드를 다시 실행해도 행이 중복되지 않습니다. 모든 파싱이 로컬에서 이루어지므로 외부 서비스에 고객 또는 스테이징 데이터를 다시 업로드하지 않고 시드를 반복 수정할 수 있습니다.
실제 컬럼이 TEXT나 DECIMAL을 필요로 할 때 VARCHAR(255) 조정CREATE TABLE 초안은 모든 컬럼에 VARCHAR(255)를 사용하므로, 긴 설명은 TEXT로, 금액은 DECIMAL(p,s)로, 타임스탬프는 TIMESTAMP로 마이그레이션에서 수정한 뒤 프로덕션에서 실행하세요. 초안을 그대로 적용하기보다 실제 스키마와 생성된 컬럼 타입을 대조하여 검토하세요. 여기서의 타입 추론은 순전히 어휘 기반입니다. `1234` 컬럼은 INT로, `12.50`은 DECIMAL로 취급되지만 샘플 행이 이미 이를 증명해야 하고, 빈 셀은 빈 문자열 `''`이 아닌 NULL이 됩니다(SQL 삼가논리). 테이블 이름 정리에서는 공백과 구두점을 제거하지만 MySQL의 `order`나 `user` 같은 예약어는 인용 처리하지 않습니다. 대부분의 엔진은 패킷 크기 제한을 준수하기 위해 약 1000행 단위의 다중 행 VALUES 그룹으로 INSERT를 배칭하는 것이 좋습니다.

기술 원리

CSV 입력은 RFC 4180 준수 상태 머신(큰따옴표 필드, 이스케이프된 이중 따옴표, CRLF/LF 줄 끝 처리)으로 파싱된 후 ANSI SQL INSERT 문으로 출력됩니다. 두 문법은 겹치지 않습니다: CSV는 이스케이프에 큰따옴표 이중화("O""Brien")를 사용하고, SQL은 ISO/IEC 9075에 따라 문자열 리터럴 내부에서 작은따옴표 이중화('O''Brien')를 사용합니다. 변환기는 값을 작은따옴표로 감싸기 전에 모든 내부 아포스트로피를 이중 쌍으로 재작성하며, 이는 MySQL, PostgreSQL, SQLite, SQL Server, Oracle에서 보장되는 유일한 이스케이프 메커니즘입니다. 식별자 인용은 방언별입니다: MySQL은 백틱 `users`를, PostgreSQL과 SQL Server는 큰따옴표 "users"(인용 시 대소문자 구분)를 사용하며, SQLite는 둘 다 허용합니다 - 대소문자 폴딩으로 인한 "알 수 없는 열" 오류를 방지하려면 대상 엔진에 맞는 스타일을 선택하세요. 타입 추론은 CSV에 타입 메타데이터가 없으므로 의도적으로 최소한입니다. 선택적 CREATE TABLE 초안은 모든 열에 VARCHAR(255)를 출력합니다 - 안전하지만 비최적 - 사용자가 프로덕션에 적용하기 전에 INT, BIGINT, DECIMAL(p,s), DATE, TIMESTAMP, TEXT로 대체해야 합니다. 빈 셀은 빈 문자열 ''가 아닌 NULL(SQL 삼가논리 부재 표시)로 출력됩니다. 대부분의 스프레드시트 내보내기가 빈 필드를 누락 데이터로 사용하기 때문입니다. 빈 문자열 구분이 중요한 경우 대신 타입 로더를 사용하세요. user, order, group 같은 예약어는 자동 인용되지 않으므로, order라는 열 이름은 사용자가 직접 백틱으로 감싸지 않으면 MySQL에서 파싱에 실패합니다. 대규모 가져오기의 경우 단일 행 INSERT 문은 정확하지만 느립니다: MySQL의 기본 max_allowed_packet은 64MB이며, 약 1000행 단위의 다중 행 INSERT INTO t VALUES (...), (...)는 네트워크 왕복과 파싱 오버헤드로 인해 행당 1문장보다 보통 5-10배 빠릅니다. 배치를 BEGIN; ... COMMIT;으로 감싸면 데이터베이스가 삽입을 스테이징하고 원자적으로 커밋할 수 있으며, 부분 삽입이 외래 키 관계를 불일치하게 만들 때 필수적입니다. 이 도구는 외래 키, 인덱스, 기본 키 제약, AUTO_INCREMENT를 추론하지 않고 행 데이터만 변환하므로, 수신 스키마가 이미 존재하거나 CREATE TABLE 초안이 실행 전에 편집되어야 합니다. 수백만 행의 벌크 로드에는 PostgreSQL COPY FROM, MySQL LOAD DATA INFILE, SQL Server bcp 같은 데이터베이스 네이티브 구문을 사용하세요.

  • ISO/IEC 9075에 따른 SQL 문자열 리터럴 이스케이프: 작은따옴표는 이중화됩니다('O''Brien'), 백슬래시 이스케이프가 아닙니다.
  • 식별자 인용은 다릅니다: MySQL은 `, PostgreSQL/SQL Server는 ", SQLite는 둘 다 허용합니다.
  • 빈 CSV 셀 → SQL NULL(삼가논리), ''가 아닙니다 - 빈 문자열 구분은 손실됩니다.
  • 예약어(order, user, group)는 자동 인용되지 않습니다; 수동 이스케이프가 필요합니다.
  • 약 1000행 단위의 다중 행 INSERT 배치는 단일 행 문 대비 약 5-10배 처리량을 달성합니다(MySQL max_allowed_packet 기본 64MB).
  • 원자적 시드 삽입을 위해 BEGIN; ... COMMIT;으로 감싸세요; 부분 실패 시 깔끔하게 롤백됩니다.
  • 100만 행 이상의 벌크 로드: 생성된 INSERT보다 PostgreSQL COPY, MySQL LOAD DATA INFILE, SQL Server bcp를 선호하세요.

예시

기본 CSV -> INSERT 문 (MySQL 백틱 스타일)

CSV:
id,name,email
1,Alice,alice@example.com
2,Bob,bob@example.com

SQL:
INSERT INTO `users` (`id`, `name`, `email`) VALUES (1, 'Alice', 'alice@example.com');
INSERT INTO `users` (`id`, `name`, `email`) VALUES (2, 'Bob',   'bob@example.com');

CREATE TABLE 포함 (PostgreSQL 큰따옴표 스타일)

CSV:
product_id,price,in_stock
101,29.99,true
102,15.50,false

SQL:
CREATE TABLE "products" (
  "product_id" VARCHAR(255),
  "price"      VARCHAR(255),
  "in_stock"   VARCHAR(255)
);
INSERT INTO "products" ("product_id", "price", "in_stock") VALUES ('101', '29.99', 'true');
INSERT INTO "products" ("product_id", "price", "in_stock") VALUES ('102', '15.50', 'false');
-- 팁: 운영 환경에서 실행하기 전에 VARCHAR(255)를 INT / DECIMAL(10,2) / BOOLEAN으로 변경하세요.

값에 포함된 작은따옴표 이스케이프

CSV:
id,note
1,O'Brien signed off
2,It's already done

SQL:
INSERT INTO `notes` (`id`, `note`) VALUES (1, 'O''Brien signed off');
INSERT INTO `notes` (`id`, `note`) VALUES (2, 'It''s already done');
참고: 작은따옴표는 두 번 작성('')하는 SQL 표준 이스케이프 방식입니다.

타입 추론 - INT, DECIMAL, TEXT 비교

CSV:
user_id,score,bio
1,100,Hello
2,87.5,Long bio text...

감지된 타입 (휴리스틱):
  user_id -> INT
  score   -> DECIMAL(10,2)
  bio     -> VARCHAR(255)  (긴 내용에는 TEXT 사용 권장)

SQL 미리보기:
INSERT INTO `students` (`user_id`, `score`, `bio`) VALUES (1, 100, 'Hello');
INSERT INTO `students` (`user_id`, `score`, `bio`) VALUES (2, 87.5, 'Long bio text...');

자주 묻는 질문

어떤 형태의 SQL이 생성되나요?

표준 CREATE TABLE 문과 INSERT INTO 문을 생성합니다. 기본 방언은 이식성 있는 표준 SQL로, MySQL, PostgreSQL, SQLite, MSSQL에서 약간의 타입 조정만으로 동작합니다. 일부 페이지에서는 데이터 타입(VARCHAR vs TEXT, INT vs INTEGER 등)에 맞춰 대상 방언을 선택할 수 있습니다.

컬럼 이름은 어떻게 결정되나요?

'첫 행을 헤더로' 옵션이 켜져 있으면 CSV의 첫 행에서 가져옵니다. 페이지는 공백을 밑줄로 바꾸고 예약어는 따옴표로 감싸 이름을 정리합니다. 헤더가 비활성화된 경우에는 col_1, col_2 등으로 자동 생성됩니다.

각 컬럼의 데이터 타입은 어떻게 추론되나요?

페이지가 값을 샘플링해 가장 좁게 맞는 타입을 고릅니다. 모든 셀이 정수면 INTEGER, 일부에 소수가 있으면 DECIMAL, 가장 긴 셀에 맞춘 VARCHAR(N), true/false는 BOOLEAN, ISO 형식 문자열은 DATE/DATETIME으로 추론합니다. SQL을 생성하기 전에 추론된 타입을 직접 변경할 수도 있습니다.

데이터 안의 따옴표나 특수문자는 어떻게 처리되나요?

문자열 값 안의 작은따옴표는 두 번 써서 이스케이프됩니다(O'Brien → 'O''Brien'). 백슬래시와 유니코드 문자는 그대로 통과되며, 이는 PostgreSQL의 standard_conforming_strings = on 동작과 일치합니다. MySQL을 대상으로 한다면 NO_BACKSLASH_ESCAPES 모드와 비교해 결과를 확인하세요.

NULL과 빈 문자열은 왜 다르게 처리되나요?

비어 있는 CSV 셀(예: 'a,,c')은 SQL의 NULL이 되고, 따옴표로 감싼 빈 문자열('a,"",c')은 ''이 됩니다. 페이지는 이 관례를 따릅니다. 두 경우 모두 빈 문자열로 보존하고 싶다면 '빈 값을 NULL로 처리' 옵션을 끄세요.

데이터가 서버로 업로드되나요?

아니요. CSV 파싱과 SQL 생성은 모두 브라우저에서 이루어지며, 입력과 출력은 페이지를 떠나지 않습니다. 결과를 SQL 스크립트로 받아 직접 데이터베이스 서버로 가져오면 됩니다.

생성된 SQL을 운영 데이터베이스에 바로 사용해도 되나요?

먼저 검토하세요. CREATE TABLE 문이 기존 스키마와 일치하지 않을 수 있고, INSERT 문에는 제약 조건, 외래 키, 인덱스가 포함되어 있지 않습니다. 특히 기본 키, NOT NULL 제약, 적절한 데이터 타입 등은 직접 보완해야 하는 출발점으로 삼으세요.