CSV to SQL 変換ツール
CSV ファイルをアップロードするかデータを貼り付けて、SQL INSERT 文に変換
CSV ファイルをここにドロップするか、クリックして選択
CSV を SQL に変換とは?
CSV を SQL に変換は、CSV(カンマ区切り値)形式のデータを SQL INSERT 文に変換するオンラインデータ変換ツールです。データベースへのインポートが容易になります。
CSV は一般的な表形式データで、スプレッドシートやデータエクスポートに広く使用されています。SQL はリレーショナルデータベースの標準的な照会言語であり、INSERT 文はデータベーステーブルにデータを挿入するために使用されます。
このツールを使用すると、CSV データを実行可能な SQL 文に迅速に変換でき、カスタムテーブル名、フィールド名、引用符スタイルをサポートし、データ移行やインポート操作を容易にします。
使い方
使い方
- 入力ボックスにCSVデータを貼り付けるか入力、もしくはCSVファイルをアップロードしてください
- テーブル名を設定してください(デフォルトは table_name)
- 適切な区切り文字を選択してください(デフォルトはカンマ)
- 最初の行をフィールド名として使うかどうかを選択してください
- 右側にSQL INSERT文が生成されます
インポート時の安全対策
- 実行前に、生成されたINSERT文のテーブル名、カラム順、エスケープ、NULL値、数値の書式を確認してください。
- まず少量のバッチで実行し、データベースが対応している場合は本番インポートをトランザクションで囲んでください。
利用シーン
仕組み
CSV 入力は RFC 4180 準拠のステートマシンでパースされ(引用符付きフィールド、エスケープされた二重引用符、CRLF/LF の行末を処理)、ANSI SQL の INSERT 文として出力されます。2 つの文法は重複しません:CSV は二重引用符の二重化によるエスケープ("O""Brien")を使用し、SQL は ISO/IEC 9075 に基づき文字列リテラル内のシングルクォートの二重化('O''Brien')を使用します。コンバーターはすべての内部アポストロフィを二重ペアに書き換えてから値をシングルクォートで囲みます。これは MySQL、PostgreSQL、SQLite、SQL Server、Oracle で保証される唯一のエスケープメカニズムです。識別子の引用符は方言固有です:MySQL はバッククォート `users`、PostgreSQL と SQL Server はダブルクォート "users"(引用符付きの場合大文字小文字を区別)、SQLite は両方を受け付けます。ターゲットエンジンに合ったスタイルを選択しないと、大文字小文字のフォールディングによる「unknown column」エラーが発生します。 型推論は意図的に最小限に抑えています。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 は 64 MB で、INSERT INTO t VALUES (...), (...), (...) のような約 1000 行ごとのバッチマルチロウ INSERT は、ネットワークのラウンドトリップとパースのオーバーヘッドにより、通常 1 行 1 文より 5〜10 倍高速です。バッチを BEGIN; ... COMMIT; で囲むことで、データベースは INSERT をステージングしアトミックにコミットできます。これは部分的な挿入が外部キー関係を不整合にする場合に不可欠です。このツールは外部キー、インデックス、主キー制約、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 デフォルト 64 MB)。
- BEGIN; ... COMMIT; で囲んでアトミックなシード INSERT を実行。部分的な失敗はロールバックされる。
- 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とTEXT、INTとINTEGERなど)。
列名はどう決まりますか?
「最初の行をヘッダーとする」を有効にすると、CSVの最初の行から決まります。ページではスペースをアンダースコアに置き換え、予約語をクォートで囲んで名前をサニタイズします。ヘッダーを無効にすると、列はcol_1、col_2などになります。
各列のデータ型はどう推測されますか?
ページは値をサンプリングし、適合する最も狭い型を選択します。すべてのセルが整数ならINTEGER、一部が小数ならDECIMAL、最長セルに合わせたVARCHAR(N)、true/falseならBOOLEAN、ISO形式の文字列ならDATE/DATETIMEを選択します。SQLを生成する前に推測された型を上書きできます。
データ内のクォートや特殊文字はどう扱われますか?
文字列値内のシングルクォートは2つ重ねてエスケープされます(O'Brien → 'O''Brien')。バックスラッシュやUnicode文字はそのまま渡されます。これはPostgreSQLのstandard_conforming_strings = onの動作に一致します。MySQLをターゲットにする場合は、MySQLのNO_BACKSLASH_ESCAPESモードに対して結果を確認してください。
なぜNULLは空文字列と異なるのですか?
空のCSVセル('a,,c'など)はSQLのNULLになり、引用された空文字列('a,"",c')は ''になります。ページはこの規則に従います。両方のケースで空文字列として保持したい場合は、「空をNULLとして扱う」をオフにしてください。
データはアップロードされますか?
いいえ。CSVの解析とSQLの生成はブラウザ内で行われます。入出力はページから出ません。生成された結果はSQLスクリプトとして自分でデータベースサーバーにインポートしてください。
生成されたSQLを本番データベースで使用すべきですか?
まずレビューしてください。CREATE TABLE文は既存のスキーマと一致しない可能性があり、INSERTには制約、外部キー、インデックスが含まれません。出発点として編集することをおすすめします。特に主キー、NOT NULL制約、適切なデータ型に注意してください。