ToolDeck

แปลง CSV เป็น SQL

สร้างคำสั่ง SQL INSERT จากข้อมูล CSV

ลองตัวอย่าง

CSV อินพุต

SQL เอาต์พุต

ประมวลผลในเครื่อง · ปลอดภัยในการวางข้อมูลลับ
SQL จะแสดงที่นี่…
ชื่อตาราง:

การแปลง CSV เป็น SQL คืออะไร?

การแปลง CSV เป็น SQL คือการเปลี่ยนค่าที่คั่นด้วยเครื่องหมายจุลภาคให้กลายเป็นคำสั่ง Structured Query Language ที่ฐานข้อมูลเชิงสัมพันธ์สามารถประมวลผลได้ เอาต์พุตที่พบบ่อยที่สุดคือคู่คำสั่ง: คำสั่ง CREATE TABLE ที่กำหนดคอลัมน์ และคำสั่ง INSERT INTO หนึ่งคำสั่งหรือมากกว่าที่นำข้อมูลจากแถวใน CSV ลงสู่คอลัมน์เหล่านั้น

ไฟล์ CSV ปฏิบัติตามข้อกำหนด RFC 4180 แต่ละบรรทัดคือระเบียนข้อมูลหนึ่งแถว ฟิลด์แยกจากกันด้วยตัวคั่น (โดยทั่วไปคือเครื่องหมายจุลภาค) และฟิลด์ที่มีตัวคั่นหรือบรรทัดใหม่อยู่ภายในจะถูกครอบด้วยเครื่องหมายคำพูดคู่ SQL ในทางตรงข้ามคือภาษามาตรฐานสำหรับจัดการข้อมูลในระบบอย่าง PostgreSQL, MySQL, SQLite และ SQL Server การแปลงระหว่างสองรูปแบบนี้ถือเป็นงานนำเข้าข้อมูลที่พบบ่อยที่สุดในการพัฒนาซอฟต์แวร์

ตัวแปลง CSV เป็น SQL ที่ดีจะจัดการการใช้เครื่องหมายคำพูด escape เครื่องหมาย single quote ในค่าต่างๆ (โดยซ้ำเป็น '' ตามมาตรฐาน SQL) แมปหัวคอลัมน์ให้เป็น SQL identifier ที่ถูกต้อง และยังสามารถอนุมานประเภทข้อมูลได้ด้วย นอกจากการ escape พื้นฐาน ตัวแปลงที่ดีจะจัดรูปแบบชื่อคอลัมน์ (แทนที่ช่องว่างและขีดกลางด้วยขีดล่าง) และห่อเอาต์พุตไว้ใน transaction block เพื่อให้การนำเข้าที่ล้มเหลว rollback กลับได้อย่างสะอาด แทนที่จะทิ้งข้อมูลที่นำเข้าเพียงบางส่วนไว้ในตาราง หากไม่มีตัวแปลง การเขียนคำสั่ง INSERT ด้วยมือแม้แต่สำหรับไม่กี่ร้อยแถวก็มีโอกาสผิดพลาดสูงและเสียเวลามาก

ทำไมต้องใช้ตัวแปลง CSV เป็น SQL?

การเขียนคำสั่ง SQL INSERT ด้วยมือจากข้อมูลสเปรดชีตเป็นงานที่น่าเบื่อและเสี่ยงต่อข้อผิดพลาดด้านไวยากรณ์ ตัวแปลงจะทำส่วนที่ซ้ำซ้อนให้อัตโนมัติ เพื่อให้คุณมุ่งเน้นที่การออกแบบ schema และการตรวจสอบข้อมูลได้

สร้าง SQL ได้ในไม่กี่วินาที
วาง CSV แล้วรับเอาต์พุต SQL ที่พร้อมใช้งาน ไม่ต้องใส่เครื่องหมายคำพูดด้วยมือ escape apostrophe หรือนับคอลัมน์ การแปลงทำงานทั้งหมดในเบราว์เซอร์ของคุณ
🔒
ข้อมูลอยู่ในเบราว์เซอร์ของคุณ
CSV ของคุณไม่ออกจากเครื่อง การแยกวิเคราะห์และสร้าง SQL เกิดขึ้นฝั่ง client ทั้งหมด หมายความว่าไม่มีการอัปโหลดไปยังเซิร์ฟเวอร์ ไม่มีการบันทึก log และไม่มีบุคคลที่สามเข้าถึงชุดข้อมูลของคุณ
🎯
ได้ SQL ที่ถูกต้องตามไวยากรณ์
เครื่องหมาย single quote ในค่าต่างๆ จะถูก escape เป็น '' ตามมาตรฐาน SQL ชื่อคอลัมน์จะถูกทำให้เป็น identifier ที่ถูกต้อง เอาต์พุตถูกต้องตามไวยากรณ์สำหรับ PostgreSQL, MySQL และ SQLite
📋
รองรับโครงสร้าง CSV ทุกรูปแบบ
เครื่องมือตรวจจับตัวคั่นอัตโนมัติ (เครื่องหมายจุลภาค เซมิโคลอน แท็บ ไปป์) และจัดการฟิลด์ที่อยู่ในเครื่องหมายคำพูดซึ่งมีเครื่องหมายจุลภาคหรือบรรทัดใหม่ฝังอยู่ตามกฎ RFC 4180

กรณีการใช้งาน CSV เป็น SQL

การเติมข้อมูลเริ่มต้น (Database Seeding)
แปลงไฟล์ CSV fixture เป็นคำสั่ง INSERT สำหรับฐานข้อมูลในสภาพแวดล้อม development หรือ staging มีประโยชน์ใน CI pipeline ที่ต้องการข้อมูลเริ่มต้นที่ทำซ้ำได้โดยไม่ต้องใช้ ORM
การย้ายข้อมูล (Data Migration)
ย้ายข้อมูลที่ส่งออกจากระบบหนึ่ง (CRM สเปรดชีต แอปพลิเคชันเก่า) ไปยังฐานข้อมูลเชิงสัมพันธ์ใหม่ สร้าง SQL ตรวจสอบ แล้วรันใน transaction
การพัฒนา Backend API
เติมข้อมูลทดสอบจาก CSV ลงใน PostgreSQL หรือ MySQL ในเครื่องได้อย่างรวดเร็ว เร็วกว่าการเขียน migration script เมื่อต้องการโหลดข้อมูลเพียงครั้งเดียว
QA และการทดสอบอัตโนมัติ
สร้าง SQL จาก CSV test fixture เพื่อตั้งค่าสถานะฐานข้อมูลก่อน integration test ใช้ร่วมกับ teardown script เพื่อรีเซ็ตตารางระหว่าง test run
การเตรียมข้อมูลสำหรับวิเคราะห์
โหลดชุดข้อมูล CSV ลง SQLite เพื่อสืบค้นข้อมูลแบบ ad-hoc SQLite อ่านคำสั่ง SQL INSERT ได้โดยตรง ทำให้นี่เป็นเส้นทางที่รวดเร็วจากการส่งออกสเปรดชีตไปสู่ข้อมูลที่สืบค้นได้
การเรียนรู้ SQL
นักศึกษาสามารถแปลง CSV ตัวอย่างเป็น SQL เพื่อฝึกคำสั่ง SELECT, JOIN และ aggregate บนข้อมูลที่ดูเหมือนจริง โดยไม่ต้องตั้งค่า schema ตั้งแต่ต้น

เอกสารอ้างอิงประเภทข้อมูล SQL

เมื่อแปลง CSV เป็น SQL ทุกคอลัมน์จะใช้ค่าเริ่มต้นเป็น TEXT เพราะ CSV ไม่มีข้อมูลระบุประเภท หากคุณทราบประเภทของคอลัมน์ คุณสามารถแทนที่ TEXT ในเอาต์พุต CREATE TABLE ได้ ตารางนี้แสดงประเภท SQL ที่ใช้บ่อยที่สุดและกรณีที่ควรใช้แต่ละประเภท

ประเภทใช้สำหรับหมายเหตุ
TEXT / VARCHARStrings, mixed contentDefault safe choice; works in every SQL dialect
INTEGER / INTWhole numbers (age, count, ID)Use when column contains only digits with no decimals
REAL / FLOATDecimal numbers (price, rate)Needed for columns with dots like 19.99 or 3.14
DATEISO 8601 dates (2024-01-15)Requires consistent formatting; varies by database
BOOLEANtrue/false, 1/0, yes/noMySQL uses TINYINT(1); PostgreSQL has native BOOL
NUMERIC / DECIMALExact precision (currency)Specify scale: DECIMAL(10,2) for money columns
BLOB / BYTEABinary dataRarely needed in CSV imports; use for hex-encoded fields

การเปรียบเทียบ SQL Dialect

ไวยากรณ์ SQL มีความแตกต่างระหว่าง database engine ต่างๆ คำสั่ง INSERT ที่สร้างขึ้นใช้ SQL มาตรฐานที่ทำงานได้กับระบบส่วนใหญ่ แต่บางฟีเจอร์มีความแตกต่างกัน ตารางนี้สรุปความแตกต่างที่สำคัญที่สุดเมื่อนำเข้าข้อมูล CSV

ฟีเจอร์PostgreSQLMySQLSQLiteSQL Server
Identifier quoting"col"`col`"col"[col]
String escape'''' or \'''''
INSERT syntaxINSERT INTOINSERT INTOINSERT INTOINSERT INTO
Batch INSERTVALUES (),()…VALUES (),()…VALUES (),()…max 1000 rows
Auto-incrementSERIALAUTO_INCREMENTAUTOINCREMENTIDENTITY(1,1)
Upsert / mergeON CONFLICTON DUPLICATE KEYON CONFLICTMERGE
NULL handlingIS NULLIS NULL / <=>IS NULLIS NULL
COPY from CSVCOPY … FROMLOAD DATA INFILE.importBULK INSERT

INSERT vs COPY: การเลือกวิธีนำเข้าข้อมูล

สำหรับชุดข้อมูลขนาดเล็กถึงกลาง (ต่ำกว่า 10,000 แถว) คำสั่ง INSERT ทำงานได้ดีและใช้งานร่วมกันได้กับ SQL database ทุกชนิด สำหรับการนำเข้าขนาดใหญ่ ฐานข้อมูลมีคำสั่งโหลดข้อมูลจำนวนมากที่ข้ามตัวแยกวิเคราะห์ SQL ได้โดยตรง

INSERT INTO
SQL มาตรฐาน ใช้งานได้ทุกที่ แต่ละแถวถูกแยกวิเคราะห์เป็นคำสั่ง SQL จึงมีค่าใช้จ่ายสูงกว่าสำหรับชุดข้อมูลขนาดใหญ่ รองรับ logic เงื่อนไข (ON CONFLICT, ON DUPLICATE KEY) เหมาะที่สุดสำหรับข้อมูลเริ่มต้น การย้ายข้อมูลขนาดเล็ก และกรณีที่ต้องการควบคุมระดับแถว
COPY / LOAD DATA
ตัวโหลดข้อมูลจำนวนมากเฉพาะของแต่ละฐานข้อมูล PostgreSQL ใช้ COPY, MySQL ใช้ LOAD DATA INFILE, SQLite ใช้ .import และ SQL Server ใช้ BULK INSERT อ่าน CSV โดยตรงโดยข้ามตัวแยกวิเคราะห์ SQL เร็วกว่า 10-100 เท่าสำหรับไฟล์ขนาดใหญ่ (100K+ แถว) ต้องการการเข้าถึงระบบไฟล์บนเซิร์ฟเวอร์หรือ client

ตัวอย่างโค้ด

ตัวอย่างเหล่านี้แสดงวิธีแปลง CSV เป็นคำสั่ง SQL INSERT ในภาษาโปรแกรมต่างๆ แต่ละตัวอย่างจัดการการ escape เครื่องหมาย single quote และการทำให้ชื่อคอลัมน์เป็น identifier ที่ถูกต้อง

JavaScript (Node.js)
// CSV → SQL INSERT statements
const csv = `name,age,city
Alice,30,Berlin
Bob,25,Tokyo`

function csvToSql(csv, table = 'data') {
  const rows = csv.trim().split('\n').map(r => r.split(','))
  const [headers, ...data] = rows
  const cols = headers.map(h => h.trim().toLowerCase().replace(/\s+/g, '_'))

  const values = data.map(row =>
    '  (' + row.map(v => `'${v.replace(/'/g, "''").trim()}'`).join(', ') + ')'
  )

  return `INSERT INTO ${table} (${cols.join(', ')}) VALUES
${values.join(',\n')};`
}

console.log(csvToSql(csv, 'users'))
// → INSERT INTO users (name, age, city) VALUES
//     ('Alice', '30', 'Berlin'),
//     ('Bob', '25', 'Tokyo');
Python
import csv
import io

csv_string = """name,age,city
Alice,30,Berlin
Bob,25,Tokyo"""

reader = csv.reader(io.StringIO(csv_string))
headers = [h.strip().lower().replace(' ', '_') for h in next(reader)]

table = 'users'
rows = list(reader)

# CREATE TABLE
col_defs = ', '.join(f'{h} TEXT' for h in headers)
print(f'CREATE TABLE {table} ({col_defs});')
# → CREATE TABLE users (name TEXT, age TEXT, city TEXT);

# INSERT statements
for row in rows:
    vals = ', '.join(f"'{v.replace(chr(39), chr(39)*2)}'" for v in row)
    print(f"INSERT INTO {table} ({', '.join(headers)}) VALUES ({vals});")
# → INSERT INTO users (name, age, city) VALUES ('Alice', '30', 'Berlin');
# → INSERT INTO users (name, age, city) VALUES ('Bob', '25', 'Tokyo');
Go
package main

import (
	"encoding/csv"
	"fmt"
	"strings"
)

func csvToSQL(data, table string) string {
	r := csv.NewReader(strings.NewReader(data))
	records, _ := r.ReadAll()
	if len(records) < 2 {
		return ""
	}

	headers := records[0]
	var vals []string
	for _, row := range records[1:] {
		escaped := make([]string, len(row))
		for i, v := range row {
			escaped[i] = "'" + strings.ReplaceAll(v, "'", "''") + "'"
		}
		vals = append(vals, "  ("+strings.Join(escaped, ", ")+")")
	}

	return fmt.Sprintf("INSERT INTO %s (%s) VALUES\n%s;",
		table, strings.Join(headers, ", "), strings.Join(vals, ",\n"))
}

func main() {
	csv := "name,age,city\nAlice,30,Berlin\nBob,25,Tokyo"
	fmt.Println(csvToSQL(csv, "users"))
	// → INSERT INTO users (name, age, city) VALUES
	//     ('Alice', '30', 'Berlin'),
	//     ('Bob', '25', 'Tokyo');
}
CLI (sqlite3 / psql)
# SQLite: import CSV directly into a table
sqlite3 mydb.db <<EOF
.mode csv
.import data.csv users
SELECT * FROM users LIMIT 5;
EOF

# PostgreSQL: COPY from CSV file (server-side)
psql -c "COPY users FROM '/path/to/data.csv' WITH (FORMAT csv, HEADER true);"

# PostgreSQL: \copy from CSV (client-side, no superuser needed)
psql -c "\copy users FROM 'data.csv' WITH (FORMAT csv, HEADER true);"

# MySQL: LOAD DATA from CSV
mysql -e "LOAD DATA INFILE '/path/to/data.csv' INTO TABLE users
  FIELDS TERMINATED BY ',' ENCLOSED BY '"'
  LINES TERMINATED BY '\n' IGNORE 1 ROWS;"

คำถามที่พบบ่อย

เครื่องหมาย single quote ในค่า CSV จัดการอย่างไรในเอาต์พุต SQL?
เครื่องหมาย single quote (') ทุกตัวในค่า CSV จะถูกซ้ำเป็น '' ในเอาต์พุต SQL นี่คือ escape sequence มาตรฐาน SQL ตัวอย่างเช่น ค่าอย่าง "สมชาย O'Brien" จะกลายเป็น 'สมชาย O''Brien' ในคำสั่ง INSERT วิธีนี้ใช้ได้ใน PostgreSQL, MySQL, SQLite และ SQL Server
ฉันสามารถแปลง CSV เป็น SQL สำหรับฐานข้อมูลเฉพาะอย่าง MySQL หรือ PostgreSQL ได้ไหม?
คำสั่ง INSERT ที่สร้างขึ้นใช้ไวยากรณ์ SQL มาตรฐานที่ทั้ง MySQL และ PostgreSQL รองรับ ความแตกต่างหลักคือการใส่เครื่องหมายสำหรับ identifier: PostgreSQL ใช้เครื่องหมายคำพูดคู่ MySQL ใช้ backtick สำหรับการทำงาน INSERT พื้นฐาน เอาต์พุตใช้ได้กับทั้งสองระบบโดยไม่ต้องแก้ไข
จะเกิดอะไรขึ้นถ้า CSV ของฉันไม่มีแถวหัวคอลัมน์?
ตัวแปลงถือว่าแถวแรกคือหัวคอลัมน์ หาก CSV ของคุณไม่มีหัวคอลัมน์ ให้เพิ่มแถวหัวคอลัมน์ก่อนแปลง มิฉะนั้นแถวข้อมูลแรกจะกลายเป็นชื่อคอลัมน์ในคำสั่ง CREATE TABLE ตัวแปลงส่วนใหญ่รวมถึงเครื่องมือนี้ต้องการแถวหัวคอลัมน์
มีขีดจำกัดจำนวนแถวสำหรับการแปลง CSV เป็น SQL หรือไม่?
เนื่องจากการแปลงทำงานในเบราว์เซอร์ของคุณ ขีดจำกัดที่ใช้งานได้จริงขึ้นอยู่กับหน่วยความจำของอุปกรณ์ ไฟล์ที่มีหลายหมื่นแถวแปลงได้โดยไม่มีปัญหา สำหรับไฟล์ขนาดใหญ่มาก (500K+ แถว) ควรใช้คำสั่ง COPY หรือ LOAD DATA ของฐานข้อมูลแทนคำสั่ง INSERT
ทำไมเอาต์พุตถึงใช้ TEXT สำหรับทุกคอลัมน์แทนที่จะเป็น INTEGER หรือ DATE?
CSV เป็นรูปแบบข้อความธรรมดาที่ไม่มีข้อมูลระบุประเภท ตัวแปลงใช้ TEXT เป็นค่าเริ่มต้นที่ปลอดภัยเพื่อหลีกเลี่ยงการอนุมานประเภทที่ผิดพลาด คุณสามารถเปลี่ยนประเภทคอลัมน์ในคำสั่ง CREATE TABLE ที่สร้างขึ้นได้หลังจากตรวจสอบข้อมูลของคุณ โดย INTEGER สำหรับคอลัมน์ตัวเลขและ DATE สำหรับคอลัมน์วันที่เป็นการปรับที่พบบ่อย
ฉันควรจัดการไฟล์ CSV ที่ใช้เซมิโคลอนหรือแท็บเป็นตัวคั่นอย่างไร?
เครื่องมือนี้ตรวจจับตัวคั่นอัตโนมัติโดยวิเคราะห์แถวแรกของ CSV ระบบตรวจสอบเครื่องหมายจุลภาค เซมิโคลอน แท็บ และไปป์ แล้วใช้อักขระที่ปรากฏบ่อยที่สุด ไฟล์ CSV รูปแบบยุโรปที่ใช้เซมิโคลอนทำงานได้โดยไม่ต้องเปลี่ยนการตั้งค่าใดๆ
SQL ที่สร้างขึ้นปลอดภัยจาก injection หากรันโดยตรงหรือไม่?
เอาต์พุต escape เครื่องหมาย single quote ซึ่งป้องกันข้อผิดพลาดด้านไวยากรณ์โดยไม่ตั้งใจ อย่างไรก็ตาม หากข้อมูล CSV ของคุณมาจากแหล่งที่ไม่น่าเชื่อถือ ให้ปฏิบัติต่อ SQL ที่สร้างขึ้นเช่นเดียวกับอินพุตที่ยังไม่ผ่านการตรวจสอบ ตรวจสอบเอาต์พุตก่อนรันกับฐานข้อมูล production สำหรับการนำเข้าด้วยโปรแกรม parameterized query ปลอดภัยกว่าการต่อ string เสมอ