Excel to SQL 변환 도구
Excel 파일을 업로드하여 SQL INSERT 문으로 변환
Excel 파일을 여기에 드롭하거나 클릭하여 선택
Excel을 SQL로 변환이란?
Excel을 SQL로 변환은 Excel(.xlsx/.xls) 파일을 SQL INSERT 문으로 변환하여 데이터베이스에 쉽게 가져올 수 있도록 하는 온라인 데이터 형식 변환 도구입니다.
Excel은 데이터 저장 및 분석에 널리 사용되는 가장 일반적인 스프레드시트 형식입니다. SQL은 관계형 데이터베이스의 표준 쿼리 언어이며, INSERT 문은 데이터베이스 테이블에 데이터를 삽입하는 데 사용됩니다.
이 도구를 사용하면 Excel 스프레드시트 데이터를 실행 가능한 SQL 문으로 빠르게 변환할 수 있으며, 여러 시트 선택, 사용자 지정 테이블 이름, 인용 부호 스타일을 지원하여 데이터 마이그레이션 및 가져오기 작업을 용이하게 합니다.
사용 방법
사용 방법
- Excel 파일을 업로드하세요(.xlsx 또는 .xls 형식)
- 시트가 여러 개인 경우 변환할 시트를 선택하세요
- 테이블 이름을 설정하세요(기본값: table_name)
- 첫 번째 행을 필드명으로 사용할지 선택하세요
- SQL INSERT 문이 자동 생성되며, 클릭 한 번으로 복사할 수 있습니다
SQL 생성 점검사항
- 생성된 SQL을 실제 데이터베이스에 실행하기 전에 열 이름, 데이터 타입, 따옴표, NULL 처리를 검토하세요.
- 프로덕션 환경에 데이터를 가져오기 전에 먼저 임시 테이블에서 테스트하고 원본 스프레드시트의 백업을 보관하세요.
활용 사례
기술 원리
이 페이지는 SheetJS로 업로드된 워크북을 파싱합니다. XLSX.read(arrayBuffer, {type: 'array'})는 워크북 객체를 반환하며, 워크시트의 셀은 A1 키로 인덱싱됩니다. 그런 다음 XLSX.utils.sheet_to_json(sheet, {header: 1, defval: null})이 제한된 !ref 범위를 순회하여 배열의 배열로 변환합니다. 첫 번째 비어 있지 않은 행(첫 행을 헤더로 사용 옵션 활성화 시)이 열 이름으로 사용되고, 그렇지 않으면 SheetJS 스타일의 col1, col2, col3가 합성됩니다. 나머지 각 행은 INSERT INTO `table` (`c1`, `c2`, ...) VALUES (v1, v2, ...); 형태의 단일 SQL 문으로 출력되며, 선택적으로 CREATE TABLE `table` (`c1` VARCHAR(255), ...); 가 앞에 추가됩니다. 식별자 따옴표는 SQL 방언에 따라 다르며 SQL:1992 표준과 각 벤더의 변형에 의해 결정됩니다. 표준 SQL과 PostgreSQL은 큰따옴표("col")로 식별자를 감싸고, MySQL과 MariaDB는 기본적으로 백틱(`col`)을 사용하며 ANSI_QUOTES SQL 모드가 켜져 있을 때만 큰따옴표를 허용합니다. SQLite는 백틱과 큰따옴표 모두 허용합니다(하위 호환성을 위해, 확인되지 않는 큰따옴표 식별자를 문자열 리터럴로 처리하는 well-known 문제가 SQLite Quirks 페이지에 문서화되어 있습니다). SQL Server와 Sybase는 대괄호([col])를 사용합니다. 값 따옴표는 SQL 문자열 리터럴 규칙을 따릅니다: 작은따옴표로 감싸고 내부 작은따옴표는 이중으로 이스케이프합니다('O''Brien'). ISO/IEC 9075에 따릅니다. 빈 셀은 따옴표 없는 리터럴 NULL로 매핑되며, 빈 문자열 ''가 아닙니다. cell.t === 'n'인 숫자 셀은 따옴표 없이 출력되고, 불리언은 방언에 따라 1/0 또는 TRUE/FALSE가 되며, 날짜는 명시적 처리가 필요합니다. 날짜 셀은 특별한 주의가 필요합니다. SheetJS는 기본 숫자 시리얼을 보존하기 때문입니다. Excel은 1900-01-01부터의 일수로 날짜를 저장하며, 역사적인 1900-02-29 윤년 버그로 1900년 3월 이전 날짜가 하루 밀립니다. Excel-for-Mac 1904 시스템은 1904-01-01을 에포크로 사용합니다. ISO 8601(YYYY-MM-DD HH:mm:ss, MySQL DATETIME와 PostgreSQL TIMESTAMP 모두 수용하는 형식)로의 변환은 Unix 에포크 이후 (serial - 25569) * 86400000ms로 계산한 뒤 UTC로 포맷합니다. 타입 추론은 순수하게 어휘 기반입니다: 첫 번째 비어 있지 않은 셀이 정수이면 INT, 소수이면 DECIMAL(10,2), 텍스트이면 VARCHAR(255)가 되고, 2024-01-01로 시작하는 열은 원본 셀이 cell.t === 'd'를 가지지 않으면 문자열로 내보내집니다. 벌크 INSERT는 행마다 하나씩 출력되므로 대규모에서는 느립니다. 100~500행을 하나의 INSERT INTO t VALUES (...), (...), ...;로 합치면 네트워크 왕복이 약 100배 감소하고, 스크립트를 BEGIN; ... COMMIT;으로 감싸면 가져오기가 하나의 원자적 트랜잭션이 되어 첫 번째 실패 행에서 롤백됩니다.
- 방언별 식별자 따옴표: MySQL/MariaDB `col`(백틱, 또는 ANSI_QUOTES 활성화 시 "col"); PostgreSQL과 표준 SQL "col"; SQL Server [col]; SQLite는 둘 다 허용(단, col이 알려진 식별자가 아닐 때 "col"은 문자열 리터럴로 자동 폴백).
- 문자열 리터럴 이스케이프(ISO/IEC 9075): 작은따옴표로 감싸고 내부 작은따옴표를 이중화(O'Brien -> 'O''Brien'); 원시 백슬래시를 인라인하지 않음 - PostgreSQL의 standard_conforming_strings는 9.1부터 기본 on.
- Excel 날짜 시리얼: 1900-01-01부터의 일수이며 1900-02-29 버그 적용(또는 workbook.date1904가 true이면 1904-01-01부터); ISO 8601 문자열 = new Date((serial - 25569) * 86400000).toISOString().
- 타입 추론은 어휘 기반: 정수 -> INT, 소수 -> DECIMAL(10,2), 텍스트 -> VARCHAR(255); 날짜처럼 보이지만 cell.t === 'd'로 타입이 지정되지 않은 날짜는 문자열로 내보내짐; 천 단위 구분 기호가 있는 통화 셀은 구분 기호가 문자열 안에 포함된 채로 내보내짐.
- NULL 처리: 빈 Excel 셀은 따옴표 없는 리터럴 NULL이 됨, ''가 아님 - NOT NULL 열과 NULL은 건너뛰지만 ''는 세는 COUNT(col)에서 차이가 중요.
- 벌크 INSERT: 100~500행을 하나의 INSERT INTO t VALUES (...),(...),...;로 합치면 행마다 INSERT하는 것보다 네트워크 왕복 약 100배 절감; MySQL의 max_allowed_packet(기본 64MB)이 문장당 크기를 제한.
- 생성된 스크립트를 BEGIN;...COMMIT;(PostgreSQL/SQLite) 또는 START TRANSACTION;...COMMIT;(MySQL InnoDB)으로 감싸면 하나의 실패 행이 전체 배치를 롤백; MyISAM 테이블은 트랜잭션을 무시하고 부분 커밋.
예시
Excel 시트 → INSERT 문
"users" 시트 (3행):
id | name | email | age
1 | Alice | alice@mail.com | 28
2 | Bob | bob@mail.com | 34
생성된 SQL:
INSERT INTO users (id, name, email, age) VALUES (1, 'Alice', 'alice@mail.com', 28);
INSERT INTO users (id, name, email, age) VALUES (2, 'Bob', 'bob@mail.com', 34);단일 다중 행 INSERT (더 빠른 가져오기)
대량 로드에는 "행 결합" 옵션을 사용하세요:
INSERT INTO products (sku, name, price) VALUES
('A001', 'USB-C Cable', 9.90),
('A002', 'HDMI Adapter', 14.50),
('A003', 'Mouse Pad', 4.25);
3번의 왕복을 1번으로 줄여 100-500행 배치에 더 안전합니다.어퍼스트로피가 포함된 이름의 따옴표 이스케이프
원본 셀: O'Brien
생성된 SQL (작은따옴표 이중 처리):
INSERT INTO customers (id, name) VALUES (42, 'O''Brien');
NULL 처리 — 빈 Excel 셀은 ''가 아닌 리터럴 NULL이 됩니다:
INSERT INTO customers (id, phone) VALUES (43, NULL);트랜잭션으로 가져오기 감싸기
BEGIN;
INSERT INTO orders (id, customer_id, total, created_at) VALUES (1001, 7, 199.50, '2026-06-01');
INSERT INTO orders (id, customer_id, total, created_at) VALUES (1002, 7, 42.00, '2026-06-02');
INSERT INTO orders (id, customer_id, total, created_at) VALUES (1003, 9, 78.30, '2026-06-03');
COMMIT;
어느 한 행이라도 실패하면 전체 배치가 롤백됩니다.자주 묻는 질문
스프레드시트가 서버에 업로드되나요?
아니요. 파일은 SheetJS를 통해 브라우저에서 파싱되며 SQL도 로컬에서 생성됩니다. 어떤 데이터도 서버로 전송되지 않으므로 민감한 데이터셋도 기기 안에 안전하게 머무릅니다.
어떤 형식의 SQL이 생성되나요?
CREATE TABLE 문에 이어 행마다 하나씩 INSERT INTO 문이 생성됩니다. 생성된 SQL은 입력하신 테이블 이름과 선택하신 따옴표 스타일(작은따옴표, 큰따옴표, 백틱)을 사용합니다.
컬럼 타입은 어떻게 추론하나요?
각 컬럼을 샘플링하여 가장 좁은 범위의 적합한 타입(INTEGER, DECIMAL, VARCHAR(N), BOOLEAN, DATE/DATETIME)을 선택합니다. SQL 생성 전에 직접 변경할 수도 있습니다. 타입이 혼재된 컬럼은 VARCHAR로 처리됩니다.
Excel 날짜는 어떻게 처리되나요?
Excel 날짜는 일련번호 형태로 저장됩니다. 본 도구는 시트의 원시 값을 그대로 출력하므로, 생성된 SQL을 확인한 뒤 필요하면 대상 데이터베이스 형식에 맞게 날짜 리터럴을 직접 조정해 주세요.
특수 문자와 따옴표는 어떻게 이스케이프되나요?
작은따옴표는 두 번 반복됩니다(Smith's → Smith''s). 백슬래시와 유니코드 문자는 그대로 통과되며, 이는 PostgreSQL의 표준 준수 문자열 처리와 일치합니다. NO_BACKSLASH_ESCAPES가 비활성화된 MySQL을 사용하는 경우에는 백슬래시를 직접 이스케이프해야 할 수 있습니다.
결과가 MySQL, PostgreSQL, SQLite, MSSQL에서 모두 작동하나요?
기본 INSERT 문은 네 가지 모두에서 작동합니다. CREATE TABLE 문은 호환성이 높은 타입(INT, VARCHAR, DECIMAL, DATE)을 사용합니다. SERIAL, AUTO_INCREMENT, IDENTITY 같은 방언별 타입이 필요하면 CREATE 문을 직접 수정하세요.
수식은 평가되나요?
아니요. Excel이 저장한 캐시된 값을 그대로 사용합니다. 최신 수식 결과가 필요하면 원본 통합 문서를 열어 다시 계산하고 저장한 뒤 재업로드하세요.