ToolActToolAct

Excel to SQL 변환 도구

Excel 파일을 업로드하여 SQL INSERT 문으로 변환

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

Excel을 SQL로 변환이란?

Excel을 SQL로 변환은 Excel(.xlsx/.xls) 파일을 SQL INSERT 문으로 변환하여 데이터베이스에 쉽게 가져올 수 있도록 하는 온라인 데이터 형식 변환 도구입니다.

Excel은 데이터 저장 및 분석에 널리 사용되는 가장 일반적인 스프레드시트 형식입니다. SQL은 관계형 데이터베이스의 표준 쿼리 언어이며, INSERT 문은 데이터베이스 테이블에 데이터를 삽입하는 데 사용됩니다.

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

사용 방법

사용 방법

  1. Excel 파일을 업로드하세요(.xlsx 또는 .xls 형식)
  2. 시트가 여러 개인 경우 변환할 시트를 선택하세요
  3. 테이블 이름을 설정하세요(기본값: table_name)
  4. 첫 번째 행을 필드명으로 사용할지 선택하세요
  5. SQL INSERT 문이 자동 생성되며, 클릭 한 번으로 복사할 수 있습니다

SQL 생성 점검사항

  • 생성된 SQL을 실제 데이터베이스에 실행하기 전에 열 이름, 데이터 타입, 따옴표, NULL 처리를 검토하세요.
  • 프로덕션 환경에 데이터를 가져오기 전에 먼저 임시 테이블에서 테스트하고 원본 스프레드시트의 백업을 보관하세요.

활용 사례

선택한 워크북 시트에서 SQL 생성Excel 파일을 업로드하고 시트를 선택한 뒤 테이블 이름을 지정하면 헤더 이름 또는 col1, col2, col3 같은 자동 생성 열 이름 기반으로 INSERT 문을 생성합니다. 전체 파이프라인이 기기에서 실행되므로 내부 가격표, 인사 데이터, 스테이징 스냅샷 등 노출하면 안 되는 스프레드시트 내용이 브라우저를 벗어나지 않습니다.
대상 데이터베이스 초안에 맞는 식별자 따옴표 설정테이블·열 따옴표를 백틱, 큰따옴표, 작은따옴표 사이에서 전환하고, 간단한 VARCHAR(255) CREATE TABLE 문을 선택적으로 포함할 수 있습니다. 모든 파싱과 SQL 생성이 로컬에서 이루어지므로 대상 데이터베이스에서 실행하기 전에 열 이름, 데이터 타입, 따옴표 처리를 검토할 수 있습니다.
명확한 한계를 인지하고 로컬 시드 데이터 준비변환기는 셀 값을 SQL 문자열 또는 NULL로 보존하고 작은따옴표를 이스케이프하지만, 타입, 제약조건, 인덱스, 날짜 의미론, 트랜잭션, 벌크 로드 구문은 추론하지 않습니다. 출력을 시드 데이터 초안으로 취급하고 완성된 마이그레이션으로 여기지 마세요.
대상 RDBMS에 맞는 따옴표 스타일 선택MySQL과 SQLite는 백틱, PostgreSQL은 큰따옴표, SQL Server는 대괄호를 사용합니다. 드롭다운에서 맞는 스타일을 선택하면 생성된 스크립트를 대상 콘솔에서 수동 편집 없이 실행할 수 있습니다. SQLite는 DUAL 열 컨텍스트가 없는 경우 큰따옴표 식별자를 문자열 리터럴로 취급하므로 안전한 크로스 디폴트는 테이블·열 이름에 백틱 또는 대괄호를 쓰고 값에는 작은따옴표를 사용하는 것입니다. 타입 추론도 순수하게 어휘 기반입니다. 첫 번째 비어 있지 않은 셀이 1, 2, 3이면 INT로, 2024-01-01로 시작하면 날짜처럼 보여도 문자열로 내보내지며, 천 단위 구분 기호가 있는 통화 셀은 해당 구분 기호가 문자열 안에 포함된 채로 내보내집니다.
다중 행 INSERT를 트랜잭션으로 감싸기페이지는 행마다 INSERT를 출력하므로 대량 import에는 느리고 안전하지 않습니다. 수백 행 이상을 라이브 데이터베이스에 넣을 때는 전체 블록을 BEGIN/COMMIT 쌍으로 감싸거나 엔진의 벌크 로더를 사용하세요. 헤더 행 감지는 선택한 시트의 첫 번째 비어 있지 않은 행을 탐색하여 해당 텍스트를 기반으로 INSERT INTO ... (col1, col2, ...)를 출력합니다. DATE 셀은 Excel 시리얼 넘버 규칙(1900-01-01부터의 일수, 1900년 윤년 버그로 3월 1일이 하루 밀림, 따라서 25569가 1970-01-01 Unix 에포크)으로 읽히며, 재계산되지 않은 수식 셀은 오래된 .value를 carry하고, 병합된 셀 범위는 왼쪽 상단 앵커만 노출하므로 넓은 병합 제목 행은 파서에 단일 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이 저장한 캐시된 값을 그대로 사용합니다. 최신 수식 결과가 필요하면 원본 통합 문서를 열어 다시 계산하고 저장한 뒤 재업로드하세요.