CSV → SQL コンバーター
CSVをSQL INSERT文に変換。CREATE TABLEも追加でき、MySQL・PostgreSQL・SQLiteに対応。先頭のゼロを保持し、MySQLのバックスラッシュをエスケープ、引用符フィールドとNULLも処理。
- ブラウザ内で処理
- データはブラウザ外に出ません
- 無料 · 登録不要
WeChat でスキャンしてシェア
例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。
値の書き方
- 空のフィールドは
NULLになります。 - 空でないセルがすべて普通の数値(
42、-7、19.90)の列は引用符なしで出力します。普通の数値とは、先頭のゼロ・+・指数がなく、15 桁以内のものです。 - それ以外の列は数値も含めてすべて引用符付きの文字列にするので、
02134、1e5、20 桁のカード番号も元の文字のまま残ります。列が数値型なら、MySQL・PostgreSQL・SQLite はいずれも引用符付きの数値を変換して格納します。 - 単一引用符はどの方言でも 2 つ重ねます(
O”Brien)。MySQL ではバックスラッシュも 2 つにします。MySQL の既定の SQL モードは文字列中の\nを改行として読むためです(MySQL 8.4 Reference Manual, String Literals、表 11.1)。standard_conforming_stringsが有効な PostgreSQL(9.1 以降の既定、PostgreSQL 4.1.2.1)と SQLite は、バックスラッシュをそのまま保存します。 - ヘッダーより多いセルには
column_3、column_4などの列を追加し、ステータス行に表示します。短い行はNULLで埋めます。
例:引用符・先頭のゼロ・空のフィールド
入力(SQLite、バッチモード、テーブル名 customers):
id,name,zip,note
1,"O'Brien, Pat",02134,
2,Lee,10001,"path C:\new"
INSERT INTO "customers" ("id", "name", "zip", "note") VALUES
(1, 'O''Brien, Pat', '02134', NULL),
(2, 'Lee', '10001', 'path C:\new');
引用符付きの “O’Brien, Pat” はカンマを含んだまま、空の note は NULL になります。02134 があるため zip 列は文字列の列になり、10001 も引用符で囲みます。SQLite 3 で実行すると、SELECT zip FROM customers は 02134 と 10001 を返します。
同じ入力で MySQL を選ぶとバックスラッシュが 2 つになり、保存される値は path C:\new のままです。
id,name,zip,note
1,"O'Brien, Pat",02134,
2,Lee,10001,"path C:\new"
INSERT INTO `customers` (`id`, `name`, `zip`, `note`) VALUES
(1, 'O''Brien, Pat', '02134', NULL),
(2, 'Lee', '10001', 'path C:\\new');
サーバーの sql_mode に NO_BACKSLASH_ESCAPES が入っている場合、バックスラッシュは普通の文字です。そのサーバーには PostgreSQL か SQLite の出力を使ってください。
例:CREATE TABLE
CREATE TABLE を追加を選ぶと、列の型を値から決めます。整数は INTEGER(MySQL は INT、2,147,483,647 を超えると BIGINT)、小数点を含む数値は DOUBLE PRECISION(MySQL は DOUBLE、SQLite は REAL)、それ以外は TEXT です。PostgreSQL の例:
order_id,amount,paid_at
1001,19.90,2026-09-30
1002,5,
CREATE TABLE "orders" ("order_id" INTEGER, "amount" DOUBLE PRECISION, "paid_at" TEXT);
INSERT INTO "orders" ("order_id", "amount", "paid_at") VALUES
(1001, 19.90, '2026-09-30'),
(1002, 5, NULL);
型が重要な場合は実行前に直してください。金額は NUMERIC / DECIMAL、paid_at のような日付は DATE や TIMESTAMP が適しています。主キーや制約は付けません。
例:ヘッダーよりセルが多い行
sku,qty
A-1,3,fragile
B-2,5
INSERT INTO "stock" ("sku", "qty", "column_3") VALUES ('A-1', 3, 'fragile');
INSERT INTO "stock" ("sku", "qty", "column_3") VALUES ('B-2', 5, NULL);
追加した column_3 はステータス行に表示されます。正式な列名にしたい場合はヘッダー行で名前を付けてください。
制限事項
- 区切り文字はカンマだけで、1 行目は常にヘッダーです。セミコロンやタブ区切りのファイルは先に変換してください。
- 型は文字列から推測するだけです。日付、真偽値、
1e5は文字列として扱います。 - テーブル名と列名は 1 つの識別子として囲むので、
public.usersはドットを含む 1 つの名前になります。 - 大きなファイルもブラウザーのタブ内で一度に変換します。数百万行ならデータベースの一括読み込み(
LOAD DATA、COPY、.import)を使ってください。
FAQ
このツールは何をしますか?
CSV データを SQL の INSERT 文に変換し、必要なら CREATE TABLE 文も出力します。ヘッダー行が列名になり、各データ行が値の組になります。値は選んだ方言に合わせて引用符で囲み、エスケープします。
対応している SQL 方言は?
MySQL(識別子はバッククォート、文字列中のバックスラッシュは 2 つに)、PostgreSQL と SQLite(識別子は二重引用符、バックスラッシュはそのまま)です。INSERT の構文は 3 つとも同じです。
NULL はどう扱われますか?
空のフィールドは引用符なしの NULL になります。空白だけのフィールドは文字列で、NULL ではありません。空文字列 '' は出力できません。
02134 は引用符付きなのに 10001 は付かないことがあるのはなぜ?
列のすべての空でないセルが普通の数値(先頭のゼロなし、+ や指数なし、15 桁以内)のときだけ、その列を数値として出力します。02134 は普通の数値ではないので zip 列全体を引用符で囲み、先頭のゼロが残ります。
データはサーバーに送信されますか?
いいえ。変換はすべてブラウザー内の JavaScript で行われ、CSV データは送信されません。