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三種方言,依選擇切換識別字的引號字元與型別名稱(例如小數欄在MySQL中為DOUBLE,在PostgreSQL中為DOUBLE PRECISION,在SQLite中為REAL)。值中的單引號依SQL標準方式重複書寫,選擇MySQL時反斜線也會重複書寫以跳脫,因此可以直接執行。處理全部在瀏覽器內完成,CSV的內容不會被傳送到外部。

產生INSERT語句的操作步驟

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

用好本工具的小技巧

  • 欄的型別會檢查該欄所有資料列的值自動判定。只要有一個值不是數字,整欄都會成為字串型別。像郵遞區號、電話號碼這樣以0開頭的數字串,為了不遺失開頭的0,也會以字串型別處理。
  • 啟用"將多行合併為一條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語句中一次匯入的方式,能減少語句解析與提交的次數,執行速度更快。

常見問題

會檢查該欄所有資料列的值來決定。全部為整數時為整數型別(MySQL為INT,PostgreSQL・SQLite為INTEGER),如有超出4位元組範圍(-2,147,483,648〜2,147,483,647)的值則為BIGINT(SQLite仍為INTEGER)。全部為小數時為倍精度小數型別(MySQL為DOUBLE,PostgreSQL為DOUBLE PRECISION,SQLite為REAL)。含有字串的欄、整數與小數混合的欄、以0開頭的數字串(如0123),以及超出BIGINT範圍的整數為TEXT型別。

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

依照SQL標準的跳脫方式,單引號會自動轉換為兩個連寫的形式('')。MySQL在預設設定下把反斜線視為跳脫字元,因此選擇MySQL時反斜線也會重複書寫(C:\new 會變成 C:\\new)。如果伺服器啟用了 NO_BACKSLASH_ESCAPES,反斜線會以兩個的形式儲存,請先把產生的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)都為此專門提供了機制,可見這是一項非常常見的任務。像本工具這樣的轉換工具,在無需搭建那套完整機制的小規模驗證或資料遷移場景中,仍然是一種方便快捷的手段。