CSV轉SQL轉換器(生成INSERT語句)

將CSV檔案轉換為SQL的INSERT語句和CREATE TABLE語句。支援MySQL、PostgreSQL、SQLite三種方言,並自動判定列的型別(整數・小數・字串)。轉換處理完全在瀏覽器內完成,資料不會發送到伺服器。

分隔符
將第一行作為表頭
表名
SQL方言
同時生成CREATE TABLE語句
將空值視為NULL
將多行合併為一條INSERT語句


            
            已複製!
            
          

輸入CSV資料後,生成的SQL語句將顯示在此處。

CSV行與INSERT語句的對應關係

CSV的一行 name,age,city
轉換後的INSERT語句 INSERT INTO `my_table` (`name`, `age`, `city`) VALUES ('Alice', 30, 'Tokyo');

將第一行作為表頭時,第二行及以後的每一行都會轉換為一條指定了表頭列名的INSERT語句。被判定為整數或小數的列會以不帶引號的數值形式輸出,其餘列則以單引號括起的字串形式輸出。

關於CSV轉SQL轉換器(生成INSERT語句)

手邊有一份CSV想匯入資料庫時,逐行手寫INSERT語句既費時又容易出錯。這款工具會讀取CSV,將每一行自動轉換成INSERT語句。列的型別是透過掃描所有資料行判定整數、小數或字串,因此還能一併生成CREATE TABLE語句,不必自己另外定義欄位型別。

工具支援MySQL、PostgreSQL、SQLite三種SQL方言,切換方言時,識別符的引號字元與型別名稱會自動對應調整。值裡若含有單引號,也會依SQL標準自動轉義,產生的語句可以直接執行。整個轉換過程都在瀏覽器內完成,CSV內容不會傳送到任何伺服器,可放心處理含真實資料的檔案。

產生INSERT語句的操作步驟

  1. 貼上CSV資料 將CSV內容貼到輸入欄。若資料是以Tab分隔,記得把分隔符改為製表符。
  2. 設定表名與方言 輸入要匯入的表名,並選擇資料庫使用的SQL方言,識別符的引號字元會自動切換。
  3. 選擇輸出選項 決定是否同時生成CREATE TABLE語句、是否將空值視為NULL,以及是否將多行合併為一條INSERT語句。
  4. 複製並執行 複製產生的SQL,貼到資料庫用戶端執行。若資料量龐大,建議分批執行。

用好本工具的小技巧

  • 列的型別(整數・小數・字串)通過檢查該列所有資料行的值自動判定。只要有一個值不是數字,整列都會被視為字串型別。
  • 啟用"將多行合併為一條INSERT語句"後,會生成 `INSERT INTO ... VALUES (...), (...), (...);` 這樣的單條語句,可減少匯入大量資料時的執行次數。
  • MySQL使用反引號(`)括住表名和列名,而PostgreSQL和SQLite使用雙引號("),選擇的SQL方言不同,引號字元會自動切換。
  • 關閉"將空值視為NULL"後,字串型別的列會輸出為空字串(''),數值型別的列則會輸出為NULL。

CSV轉SQL轉換器的應用場景

準備測試用的種子資料

把試算表整理好的測試資料直接轉成INSERT語句,適合不需要動用框架seeder的小規模驗證。

遷移主檔資料

將舊系統匯出的CSV轉換成可匯入新資料庫的格式,同時取得對應的CREATE TABLE語句。

檢查列的型別

透過自動判定的型別,能及早發現混入非預期值的欄位。原本該是數值的列若被判定為字串型別,就是資料異常的訊號。

比較不同方言的語法差異

用同一份CSV切換不同方言,就能實際比較識別符引號與型別名稱的差異。

匯入SQL相關術語

INSERT語句
用來向表中新增一行資料的SQL指令,會將列名與對應的值一一指定。
CREATE TABLE語句
用來新建一張表的SQL指令,需定義列名與型別。若目標表尚未存在,就需要先執行這條語句。
SQL方言
不同資料庫產品之間的語法差異,例如包住識別符的符號、型別名稱的寫法都可能不同。
NULL
表示「值不存在」的特殊狀態,與空字串是兩回事,因此需要另外決定空值該如何處理。
轉義(escape)
讓具有特殊語法意義的字元被當成普通字元處理的做法,本工具主要用於處理值中出現的單引號。
批次插入
將多行資料合併在同一條INSERT語句中一次匯入的方式,能減少語句解析與提交的次數,執行速度更快。

常見問題

會檢查該列所有資料行的值:若全部為整數則判定為INTEGER型別,若全部為小數則判定為REAL型別,其餘情況(字串或混合)判定為TEXT型別。生成CREATE TABLE語句時會直接採用該判定結果作為列型別。

可以。在"SQL方言"中選擇PostgreSQL或SQLite後,表名・列名的引號(雙引號)和型別名會輸出為對應資料庫所遵循的格式。

按照SQL標準的轉義方式,單引號會自動轉換為兩個連續的單引號(''),因此生成的語句可以直接執行。

不會。所有轉換處理都在瀏覽器內的JavaScript中完成,您輸入的CSV內容不會被發送到任何伺服器。即使是包含實際資料的CSV,也可以放心使用。
工具君

閒話 ― 為什麼說合並後的INSERT語句更"快"

本工具可生成的"將多行合併為一條INSERT語句"(`INSERT INTO t VALUES (1,'a'), (2,'b'), ...;`)在執行速度上,通常比逐行發出單獨的INSERT語句要快得多。這是因為它減少了資料庫解析每條SQL語句、生成執行計劃的開銷,以及每條語句都要重複一次事務提交所產生的成本。

不過,MySQL存在 `max_allowed_packet` 限制,PostgreSQL也有類似的通訊緩衝區上限,如果將過多的行塞進一條INSERT語句中,可能會超出該上限而導致錯誤。實際工作中,通常會將語句按每幾百到幾千行進行拆分。

將CSV檔案匯入測試資料庫的工作,在開發現場常被稱為"準備種子資料(seeding)",許多Web框架(例如Laravel的seeder和factory)都為此專門提供了機制,可見這是一項非常常見的任務。像本工具這樣的轉換工具,在無需搭建那套完整機制的小規模驗證或資料遷移場景中,仍然是一種方便快捷的手段。