ToolAct工具行動

CSV 轉 SQL 工具

上傳 CSV 檔案或貼上資料,轉換為 SQL INSERT 語句

拖放 CSV 檔案到此處,或點選選擇檔案

什麼是 CSV 轉 SQL?

CSV 轉 SQL 是一個線上資料格式轉換工具,可以將 CSV(逗號分隔值)格式的資料轉換為 SQL INSERT 語句,方便匯入資料庫。

CSV 是一種常見的表格資料格式,廣泛用於電子試算表和資料匯出。SQL 是關聯式資料庫的標準查詢語言,INSERT 語句用於向資料庫表中插入資料。

使用本工具,您可以快速將 CSV 資料轉換為可執行的 SQL 語句,支援自訂表名、欄位名稱和引號風格,方便資料遷移和匯入操作。

使用方法

使用方式

  1. 在輸入框貼上或輸入 CSV 資料,或上傳 CSV 檔案
  2. 設定資料表名稱(預設為 table_name)
  3. 選擇適當的分隔符號(預設為逗號)
  4. 選擇是否將第一行作為欄位名稱
  5. 右側將產生 SQL INSERT 陳述式

匯入安全

  • 執行前請檢查產生的 INSERT 陳述式,確認資料表名稱、欄位順序、跳脫處理、NULL 值與數值格式。
  • 先執行少量批次匯入;若資料庫支援,請將正式匯入包裝在交易中。

使用場景

從小型 CSV 匯出產生 INSERT 語句上傳 CSV、TSV 或文字表格,選擇分隔符,設定表名,使用標頭名稱或自動產生的 col1、col2、col3 欄位來產生 SQL INSERT 語句。解析和語句產生都在瀏覽器中執行,因此要匯入的資料列在貼入 psql、mysql 或遷移工具之前不會離開裝置。
根據資料庫風格調整識別碼引號在 MySQL 的反引號、PostgreSQL/標準 SQL 的雙引號和字串字面量的單引號之間切換,並可選擇附帶包含 VARCHAR(255) 欄位的簡單 CREATE TABLE 語句。將其作為受控的中間步驟,然後在依賴之前根據目標資料庫版本驗證 SQL。
準備種子資料的同時留意 SQL 限制工具會跳脫值中的單引號和雙引號,支援四種分隔符,適合用於展示、本地 fixture 和管理修復草稿,但不會推斷資料型別、約束、索引、交易或資料庫專用的批次載入語法如 COPY、LOAD DATA 或多列 VALUES 批次。
在共享資料庫播種時加入 IF NOT EXISTS 防護將產生的 INSERT 批次包裝在 BEGIN/COMMIT 交易中,或搭配手動的 DELETE/INSERT 模式,避免在開發和預備環境的 schema 中重複插入資料列。由於所有解析都在本地進行,你可以反覆調整種子資料而無需重新上傳客戶或預備環境的資料到外部服務。
根據實際欄位調整 VARCHAR(255) 為 TEXT 或 DECIMALCREATE TABLE 草稿對每個欄位都使用 VARCHAR(255),因此在正式環境執行插入之前,請在遷移中將長描述改為 TEXT、金額改為 DECIMAL(p,s)、時間戳改為 TIMESTAMP。對照實際 schema 審查產生的欄位型別,而非直接套用草稿。此處的型別推斷純粹基於字詞:只有在樣本行已證明的情況下,`1234` 才會被視為 INT、`12.50` 視為 DECIMAL,空欄位會成為 NULL 而非空字串 `''`(依 SQL 三值邏輯),表名清理會移除空格和標點但不會為 MySQL 保留關鍵字如 `order` 或 `user` 加上引號。大多數引擎也建議每批多列 VALUES 大約 1000 行,以保持在封包大小限制內。

技術原理

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 約束、以及合適的型別都要再調整。