MYMONDAY.ai
서비스스튜디오도구데이터·포맷73CSS 생성기19색상·이미지10인코딩·보안10웹·SEO11개발·데브옵스10파일·내보내기18계산기6가이드

JSON to SQL 변환기

JSON 레코드 배열을 PostgreSQL, MySQL, SQLite용 CREATE TABLE 문과 묶음 INSERT 문으로 바꿉니다.

  • 브라우저에서 처리
  • 가입 없음
  • 무료

도구 작업 공간

예제

옵션

방언

열 타입, 불리언 리터럴, 문자열 이스케이프가 달라집니다.

JSON 입력

23줄344byte

결과

⌘/Ctrl + Enter로 복사
결과 · records.sql
CREATE TABLE "records" (
  "id" INTEGER NOT NULL,
  "name" TEXT NOT NULL,
  "email" TEXT,
  "active" BOOLEAN NOT NULL,
  "score" DOUBLE PRECISION NOT NULL
);

INSERT INTO "records" ("id", "name", "email", "active", "score") VALUES
  (1, 'Ada Lovelace', 'ada@example.com', TRUE, 98.5),
  (2, 'Grace Hopper', 'grace@example.com', FALSE, 91),
  (3, 'Linus', NULL, TRUE, 87.25);
행3
열5
크기375byte

JSON to SQL 변환기는 객체 배열을 읽어 CREATE TABLE 문 하나와 INSERT 문을 씁니다. 열은 모든 레코드의 키를 합친 것이고, 타입은 값에서 추론하며, 식별자와 리터럴은 고른 방언(PostgreSQL, MySQL, SQLite)을 따릅니다.

API 내보내기나 픽스처 파일을 임시 데이터베이스에 빠르게 올리는 작업에 알맞습니다. 중첩 객체와 배열은 JSON으로 저장되고 기본 키나 인덱스는 만들지 않으므로, 출력은 운영에 쓰기 전에 다듬을 초안 스키마로 보세요.

변환은 브라우저 안에서 이루어집니다. 200,000자를 넘는 입력은 Web Worker에서 처리하고 1,000,000자를 넘으면 편집기에서 원문을 숨기되 전체를 변환합니다. 한도는 20 MiB, 50,000행, 200열입니다.

사용 방법

  1. 객체 배열 붙여넣기

    행 목록 같은 JSON을 붙여넣습니다. 객체 하나는 한 행으로 받아들이고, 빈 배열이나 객체가 아닌 원소는 거부됩니다.

  2. 테이블 이름 정하기

    테이블 이름(기본 records)에 비어 있지 않은 이름을 입력합니다. 식별자로 따옴표 처리되므로 공백이나 예약어도 안전합니다.

  3. 방언 고르기

    PostgreSQL, MySQL, SQLite 중에서 고릅니다. 방언에 따라 따옴표 문자, 열 타입, 불리언 리터럴, 문자열 이스케이프가 달라집니다.

  4. NOT NULL 정하기

    가능하면 NOT NULL을 켜면 null이나 누락된 값이 하나도 없는 열에 NOT NULL이 붙습니다.

  5. 변환하고 검토

    열 타입과 결과 아래의 안내를 확인합니다. JSON 열과 텍스트가 다른 타입과 섞인 열을 알려 줍니다. 그다음 SQL을 복사하거나 테이블 이름을 딴 파일로 내려받습니다.

작동 원리

열 타입 추론

열마다 null이 아닌 값의 종류를 모읍니다. 정수, 32비트를 넘는 큰 정수, 소수, 불리언, 텍스트, 중첩 JSON입니다. 종류가 하나면 그에 맞는 타입이 됩니다. 정수와 소수가 함께 있으면 숫자형(DOUBLE PRECISION, DOUBLE, REAL)을 유지하고, 32비트를 넘는 정수가 있으면 BIGINT가 됩니다.

객체와 배열은 JSON.stringify로 직렬화해 JSON 텍스트(JSONB, JSON, TEXT)로 저장합니다. 텍스트가 다른 종류와 섞인 열은 TEXT가 되고 모든 값에 따옴표가 붙으므로 7과 "A7"이 한 열에 공존할 수 있습니다.

값PostgreSQLMySQLSQLite
정수INTEGERINTINTEGER
32비트 초과BIGINTBIGINTINTEGER
소수 (또는 정수와 혼합)DOUBLE PRECISIONDOUBLEREAL
불리언BOOLEANBOOLEANINTEGER
객체 또는 배열JSONBJSONTEXT
텍스트, 혼합, 전부 nullTEXTTEXTTEXT

따옴표, 이스케이프, 배치

식별자는 PostgreSQL과 SQLite에서는 큰따옴표, MySQL에서는 백틱으로 감싸고 이름 안의 따옴표 문자는 두 번 씁니다. 문자열 값은 작은따옴표로 감싸며 안의 작은따옴표를 두 번 씁니다. MySQL은 기본적으로 문자열 안의 백슬래시를 이스케이프로 읽으므로 백슬래시도 두 번 씁니다.

null이거나 없는 키는 NULL, 불리언은 TRUE·FALSE(SQLite는 1·0), 그 밖의 수는 따옴표 없는 숫자로 씁니다. 행은 한 INSERT ... VALUES에 최대 500행씩 묶이므로 1,200행 배열은 INSERT 세 개가 됩니다.

INSERT INTO "users" ("id", "name") VALUES
  (1, 'O''Neil'),
  (2, 'Bo');

실제 예시

따옴표, 객체, 배열, null이 있는 PostgreSQL (테이블 users)
입력
[{"id":1,"name":"O'Neil","active":true,"meta":{"plan":"pro"},"note":null},{"id":2,"name":"Bo","active":false,"tags":["a"]}]
출력
CREATE TABLE "users" (
  "id" INTEGER NOT NULL,
  "name" TEXT NOT NULL,
  "active" BOOLEAN NOT NULL,
  "meta" JSONB,
  "note" TEXT,
  "tags" JSONB
);

INSERT INTO "users" ("id", "name", "active", "meta", "note", "tags") VALUES
  (1, 'O''Neil', TRUE, '{"plan":"pro"}', NULL, NULL),
  (2, 'Bo', FALSE, NULL, NULL, '["a"]');

테이블 이름 users로 실행한 결과입니다. O'Neil의 따옴표가 두 번 쓰이고, meta와 tags는 JSONB이며, 레코드에 없는 키는 NULL이 됩니다. id, name, active에는 NOT NULL이 붙고 note와 tags에는 붙지 않습니다.

MySQL 식별자와 이스케이프 (테이블 이름 order items)
입력
[{"sku":"A-1","qty":3,"price":9.5,"in_stock":true,"path":"C:\\tmp"}]
출력
CREATE TABLE `order items` (
  `sku` TEXT NOT NULL,
  `qty` INT NOT NULL,
  `price` DOUBLE NOT NULL,
  `in_stock` BOOLEAN NOT NULL,
  `path` TEXT NOT NULL
);

INSERT INTO `order items` (`sku`, `qty`, `price`, `in_stock`, `path`) VALUES
  ('A-1', 3, 9.5, TRUE, 'C:\\tmp');

테이블 이름 order items와 MySQL로 실행한 결과입니다. 테이블 이름은 백틱으로 감싸이고, qty는 INT, price는 DOUBLE이며, path의 백슬래시는 두 번 쓰입니다.

한 열의 정수와 소수
입력
[{"id":1,"price":9.5,"views":3000000000},{"id":2,"price":3,"views":12}]
출력
CREATE TABLE "records" (
  "id" INTEGER NOT NULL,
  "price" DOUBLE PRECISION NOT NULL,
  "views" BIGINT NOT NULL
);

INSERT INTO "records" ("id", "price", "views") VALUES
  (1, 9.5, 3000000000),
  (2, 3, 12);

9.5와 3이 함께 있어도 price 열은 숫자형(DOUBLE PRECISION)을 유지하고, views는 3000000000이 32비트에 들어가지 않아 BIGINT가 됩니다.

SQLite 대상 (테이블 events)
입력
[{"id":1,"done":true,"ts":"2024-05-01T09:00:00Z"},{"id":2,"done":false,"ts":null}]
출력
CREATE TABLE "events" (
  "id" INTEGER NOT NULL,
  "done" INTEGER NOT NULL,
  "ts" TEXT
);

INSERT INTO "events" ("id", "done", "ts") VALUES
  (1, 1, '2024-05-01T09:00:00Z'),
  (2, 0, NULL);

테이블 이름 events와 SQLite로 실행한 결과입니다. 불리언은 1과 0을 담은 INTEGER 열이고, ts는 한 레코드가 null이라 NOT NULL 없는 TEXT입니다.

텍스트와 숫자가 섞인 열
입력
[{"id":1,"code":7},{"id":2,"code":"A7"}]
출력
CREATE TABLE "records" (
  "id" INTEGER NOT NULL,
  "code" TEXT NOT NULL
);

INSERT INTO "records" ("id", "code") VALUES
  (1, '7'),
  (2, 'A7');

code에 숫자와 문자열이 함께 있어 TEXT가 되고 숫자도 따옴표 문자열 '7'로 쓰입니다. 변환기는 이 열을 안내에도 표시합니다.

자주 하는 실수

  • 큰 수는 이미 반올림되어 있습니다

    JSON.parse는 9007199254740993을 9007199254740992로 읽고 도구는 그 값을 씁니다. 큰 식별자는 JSON에서 문자열로 두세요.

  • 기본 키와 인덱스가 없습니다

    키, 인덱스, 기본값은 추가하지 않습니다. 적재한 뒤 기본 키와 외래 키를 직접 추가하세요.

  • 중첩 데이터는 JSON 텍스트로 저장됩니다

    객체나 배열은 JSON 열 하나가 되며 여러 열로 펼쳐지지 않습니다. SQLite에서는 그냥 TEXT이므로 조회할 때 JSON 함수를 쓰세요.

  • NOT NULL은 샘플만 반영합니다

    샘플의 레코드에 null이나 누락이 없었다는 이유로 NOT NULL이 붙습니다. 다른 데이터에 null이 있을 수 있다면 테이블을 만들기 전에 옵션을 끄세요.

  • 날짜는 텍스트로 남습니다

    ISO 날짜 문자열은 도구에게 일반 문자열이므로 열은 TEXT입니다. 날짜 타입이 필요하면 TIMESTAMP나 DATE로 직접 바꾸세요.

자주 묻는 질문

최상위 객체도 지원하나요?

네. 객체 하나는 한 행으로 처리됩니다. [1,2]처럼 객체나 객체 배열이 아닌 값은 거부됩니다.

없는 키는 어떻게 처리되나요?

키의 합집합 때문에 열이 만들어지고, 그 키가 없는 레코드는 NULL을 얻습니다. 이 열에는 NOT NULL이 붙지 않습니다.

INSERT 한 문장에 몇 행이 들어가나요?

한 INSERT에 최대 500행입니다. 더 큰 배열은 빈 줄로 구분된 여러 문장이 되며 전체 한도는 50,000행입니다.

어떤 SQL 방언을 지원하나요?

PostgreSQL, MySQL, SQLite입니다. MySQL과 SQLite는 대소문자만 다른 열 이름을 같게 보므로 뒤쪽 열에 Name → Name_2 같은 접미사를 붙이고 알림을 냅니다. PostgreSQL은 둘을 유지합니다. 타입, 식별자 따옴표, 문자열 이스케이프도 다릅니다.

불리언은 어떻게 쓰이나요?

PostgreSQL과 MySQL은 TRUE·FALSE, SQLite는 INTEGER 열에 1·0입니다. 열에 텍스트도 섞여 있으면 따옴표 문자열로 쓰입니다.

열 타입을 바꿀 수 있나요?

도구 안에서는 안 됩니다. 복사한 뒤 CREATE TABLE 문을 NUMERIC, TIMESTAMP, 더 좁은 VARCHAR 등으로 고치세요.

데이터가 업로드되나요?

아니요. 모든 변환은 브라우저 안에서 이루어지며 서버로 아무것도 전송되지 않습니다.

마지막 업데이트: