CSV 轉 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 陳述句。兩種文法互不重疊:CSV 使用加倍雙引號跳脫("O""Brien"),而 SQL 依 ISO/IEC 9075 在字串字面值內使用加倍單引號('O''Brien')。轉換器將每個內部撇號改寫為一對加倍引號,再用單引號包裹值——這是 MySQL、PostgreSQL、SQLite、SQL Server 和 Oracle 之間唯一保證有效的跳脫機制。識別碼引用方式因方言而異:MySQL 使用反引號 `users`,PostgreSQL 和 SQL Server 使用雙引號 "users"(引用時區分大小寫),SQLite 兩者都接受——選擇與目標引擎匹配的風格以避免因大小寫折疊導致的「未知欄位」錯誤。 型別推斷刻意保持最低限度,因為 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 列通常比逐列陳述句快 5-10 倍,因為減少了網路往返和解析開銷。用 BEGIN; ... COMMIT; 包裹批次讓資料庫暫存插入並原子提交,這在部分插入會導致外鍵關係不一致時至關重要。請注意,此工具不會推斷外鍵、索引、主鍵約束或 AUTO_INCREMENT——它只轉換列資料,因此接收端的結構描述必須已存在,或在執行前編輯 CREATE TABLE 草稿。對於數百萬列的大量載入,建議使用資料庫原生語法:PostgreSQL COPY FROM、MySQL LOAD DATA INFILE 或 SQL Server bcp。
- SQL 字串字面值跳脫依 ISO/IEC 9075:單引號加倍('O''Brien'),而非反斜線跳脫。
- 識別碼引用方式不同:MySQL 用 `,PostgreSQL / SQL Server 用 ",SQLite 兩者皆可。
- 空 CSV 儲存格 -> SQL NULL(三值邏輯),而非 ''——空字串的區別會遺失。
- 保留字(order、user、group)不會自動引用;需手動跳脫。
- 多列 INSERT 每批約 1000 列的吞吐量約為逐列陳述句的 5-10 倍(MySQL max_allowed_packet 預設 64 MB)。
- 用 BEGIN; ... COMMIT; 包裹以實現原子播種插入;部分失敗可乾淨回滾。
- 超過 100 萬列的大量載入:優先使用 PostgreSQL COPY、MySQL LOAD DATA INFILE、SQL Server bcp,而非產生的 INSERT。
範例
基本 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 vs TEXT、INT vs INTEGER 等)。
欄位名稱是怎麼決定的?
啟用「第一列為標題」時,從 CSV 第一列取得。頁面會將名稱中的空格替換成底線,並把保留字加上引號。關閉標題時,欄位會命名為 col_1、col_2 等等。
每個欄位的資料型別是怎麼推斷的?
頁面會抽樣資料,挑選最貼合的型別:所有值都是整數則為 INTEGER;有小數時用 DECIMAL;以最長字元數調整 VARCHAR(N);true/false 用 BOOLEAN;ISO 格式字串用 DATE/DATETIME。產生 SQL 前,你可以手動覆寫推斷出的型別。
資料中的引號和特殊字元會怎麼處理?
字串中的單引號會以雙寫方式跳脫(O'Brien → 'O''Brien')。反斜線和 Unicode 字元會原樣輸出——這對應 PostgreSQL 在 standard_conforming_strings = on 時的行為。若目標是 MySQL,請對照 NO_BACKSLASH_ESCAPES 模式驗證結果。
為什麼 NULL 和空字串不一樣?
CSV 中的空格(例如 'a,,c')會變成 SQL 的 NULL;明確帶引號的空字串('a,"",c')則保留為 ''。頁面遵循這個慣例。如果兩種情況都要保留為空字串,請關閉「將空白視為 NULL」。
我的資料會被上傳嗎?
不會。CSV 解析和 SQL 產生都在你的瀏覽器內完成,輸入和輸出都不會離開頁面。你需自行把產出的 SQL 腳本匯入到資料庫伺服器。
可以直接在正式資料庫上執行產出的 SQL 嗎?
請先檢查。CREATE TABLE 可能與你既有的結構不符;INSERT 也不包含約束、外鍵或索引。把它當作可編輯的起點,特別是主鍵、NOT NULL 約束、以及合適的型別都要再調整。