CSV sang SQL

Tạo câu lệnh SQL INSERT từ dữ liệu CSV

Thử ví dụ

Đầu vào CSV

Đầu ra SQL

Chạy cục bộ · An toàn để dán thông tin bí mật
SQL sẽ xuất hiện ở đây…
Tên bảng:

Chuyển đổi CSV sang SQL là gì?

Chuyển đổi CSV sang SQL biến các giá trị phân tách bằng dấu phẩy thành các câu lệnh Ngôn ngữ Truy vấn Có cấu trúc mà cơ sở dữ liệu quan hệ có thể thực thi. Đầu ra phổ biến nhất là một cặp: câu lệnh CREATE TABLE định nghĩa các cột, và một hoặc nhiều câu lệnh INSERT INTO điền dữ liệu từ các hàng trong tệp CSV vào các cột đó.

Tệp CSV tuân theo đặc tả RFC 4180. Mỗi dòng là một bản ghi, các trường được phân tách bằng dấu phân cách (thường là dấu phẩy), và các trường chứa dấu phân cách hoặc ký tự xuống dòng được bao trong dấu ngoặc kép. SQL, mặt khác, là ngôn ngữ chuẩn để quản lý dữ liệu trong các hệ thống như PostgreSQL, MySQL, SQLite và SQL Server. Chuyển đổi giữa hai định dạng này là một trong những tác vụ nhập dữ liệu phổ biến nhất trong phát triển phần mềm.

Một công cụ chuyển đổi CSV sang SQL đúng chuẩn xử lý việc đặt dấu ngoặc kép, thoát dấu nháy đơn bên trong các giá trị (nhân đôi chúng thành '' theo tiêu chuẩn SQL), ánh xạ tiêu đề cột thành các định danh SQL hợp lệ, và có thể tùy chọn suy luận kiểu dữ liệu. Ngoài việc thoát ký tự cơ bản, một công cụ tốt còn chuẩn hóa tên tiêu đề (thay thế dấu cách và dấu gạch ngang bằng dấu gạch dưới) và bao đầu ra trong một khối giao dịch, để khi nhập thất bại sẽ khôi phục hoàn toàn thay vì để lại dữ liệu không đầy đủ trong bảng. Nếu không có công cụ chuyển đổi, việc viết tay các câu lệnh INSERT cho vài trăm hàng là rất dễ mắc lỗi và tốn thời gian.

Tại sao nên dùng công cụ chuyển CSV sang SQL?

Viết tay các câu lệnh SQL INSERT từ dữ liệu bảng tính rất tẻ nhạt và dễ gây lỗi cú pháp. Công cụ chuyển đổi tự động hóa các phần lặp lại để bạn có thể tập trung vào thiết kế lược đồ và kiểm tra dữ liệu.

Tạo SQL trong vài giây
Dán CSV của bạn vào, nhận ngay đầu ra SQL sẵn sàng chạy. Không cần đặt dấu ngoặc thủ công, thoát dấu nháy đơn, hay đếm số cột. Quá trình chuyển đổi chạy hoàn toàn trên trình duyệt của bạn.
🔒
Dữ liệu được giữ trong trình duyệt
CSV của bạn không rời khỏi máy tính. Toàn bộ quá trình phân tích cú pháp và tạo SQL diễn ra phía máy khách, nghĩa là không có tải lên máy chủ, không ghi nhật ký, và không có bên thứ ba nào truy cập vào tập dữ liệu của bạn.
🎯
Tạo cú pháp SQL chính xác
Dấu nháy đơn bên trong các giá trị được thoát thành '' theo tiêu chuẩn SQL. Tên cột được làm sạch thành các định danh hợp lệ. Đầu ra có cú pháp đúng cho PostgreSQL, MySQL và SQLite.
📋
Xử lý mọi cấu trúc CSV
Công cụ tự động phát hiện dấu phân cách (dấu phẩy, dấu chấm phẩy, tab, pipe) và xử lý các trường được đặt trong ngoặc kép có chứa dấu phẩy hoặc ký tự xuống dòng, theo quy tắc RFC 4180.

Các trường hợp sử dụng CSV sang SQL

Khởi tạo dữ liệu cơ sở dữ liệu
Chuyển đổi tệp CSV thành các câu lệnh INSERT để khởi tạo dữ liệu cho môi trường phát triển hoặc staging. Hữu ích trong các pipeline CI khi bạn cần dữ liệu khởi tạo có thể lặp lại mà không cần ORM.
Di chuyển dữ liệu
Chuyển dữ liệu xuất từ một hệ thống (CRM, bảng tính, ứng dụng cũ) sang cơ sở dữ liệu quan hệ mới. Tạo SQL, xem lại, rồi chạy trong một giao dịch.
Phát triển Backend API
Nhanh chóng điền dữ liệu thử nghiệm từ CSV vào phiên bản PostgreSQL hoặc MySQL cục bộ. Nhanh hơn việc viết kịch bản di chuyển khi bạn chỉ cần tải dữ liệu một lần.
QA và Tự động hóa kiểm thử
Tạo SQL từ các tệp fixture CSV để thiết lập trạng thái cơ sở dữ liệu trước các bài kiểm thử tích hợp. Kết hợp với kịch bản dọn dẹp để đặt lại bảng giữa các lần chạy kiểm thử.
Chuẩn bị phân tích dữ liệu
Tải các tập dữ liệu CSV vào SQLite để thực hiện các truy vấn tùy chọn. SQLite đọc trực tiếp các câu lệnh SQL INSERT, tạo ra con đường nhanh từ xuất bảng tính đến dữ liệu có thể truy vấn.
Học SQL
Học viên có thể chuyển đổi CSV mẫu sang SQL để luyện tập các truy vấn SELECT, JOIN và tổng hợp trên dữ liệu thực tế mà không cần xây dựng lược đồ từ đầu.

Tài liệu tham khảo kiểu dữ liệu SQL

Khi chuyển đổi CSV sang SQL, mọi cột mặc định là TEXT vì CSV không có siêu dữ liệu kiểu. Nếu bạn biết kiểu của các cột, bạn có thể thay thế TEXT trong đầu ra CREATE TABLE. Bảng này liệt kê các kiểu SQL phổ biến nhất và khi nào nên dùng mỗi kiểu.

KiểuDùng choGhi chú
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

So sánh các phương ngữ SQL

Cú pháp SQL khác nhau giữa các công cụ cơ sở dữ liệu. Các câu lệnh INSERT được tạo ra sử dụng SQL chuẩn hoạt động trong hầu hết các hệ thống, nhưng một số tính năng nhất định có sự khác biệt. Bảng này tóm tắt các khác biệt quan trọng nhất khi nhập dữ liệu CSV.

Tính năngPostgreSQLMySQLSQLiteSQL 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: Chọn phương thức nhập dữ liệu

Đối với các tập dữ liệu nhỏ đến trung bình (dưới 10.000 hàng), các câu lệnh INSERT hoạt động tốt và có thể dùng trên mọi cơ sở dữ liệu SQL. Đối với các lần nhập lớn, cơ sở dữ liệu cung cấp các lệnh tải hàng loạt bỏ qua hoàn toàn trình phân tích cú pháp SQL.

INSERT INTO
SQL chuẩn. Hoạt động ở mọi nơi. Mỗi hàng được phân tích cú pháp như một câu lệnh SQL, nên chi phí xử lý cao hơn với tập dữ liệu lớn. Hỗ trợ logic có điều kiện (ON CONFLICT, ON DUPLICATE KEY). Phù hợp nhất cho dữ liệu khởi tạo, di chuyển nhỏ, và các trường hợp cần kiểm soát ở cấp độ hàng.
COPY / LOAD DATA
Bộ tải hàng loạt dành riêng cho từng cơ sở dữ liệu. PostgreSQL dùng COPY, MySQL dùng LOAD DATA INFILE, SQLite dùng .import, và SQL Server dùng BULK INSERT. Đọc CSV trực tiếp, bỏ qua trình phân tích cú pháp SQL. Nhanh hơn 10-100 lần với tệp lớn (100K+ hàng). Yêu cầu quyền truy cập hệ thống tệp trên máy chủ hoặc máy khách.

Ví dụ mã nguồn

Các ví dụ này minh họa cách chuyển đổi CSV sang câu lệnh SQL INSERT trong các ngôn ngữ khác nhau. Mỗi ví dụ xử lý việc thoát dấu nháy đơn và làm sạch tên cột.

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;"

Câu hỏi thường gặp

Dấu nháy đơn trong các giá trị CSV được xử lý như thế nào trong đầu ra SQL?
Mọi dấu nháy đơn (') trong một giá trị CSV đều được nhân đôi thành '' trong đầu ra SQL. Đây là chuỗi thoát chuẩn SQL. Ví dụ, một giá trị như "O'Brien" sẽ trở thành 'O''Brien' trong câu lệnh INSERT. Cách này hoạt động trong PostgreSQL, MySQL, SQLite và SQL Server.
Tôi có thể chuyển đổi CSV sang SQL cho một cơ sở dữ liệu cụ thể như MySQL hay PostgreSQL không?
Các câu lệnh INSERT được tạo ra sử dụng cú pháp SQL chuẩn mà cả MySQL và PostgreSQL đều chấp nhận. Sự khác biệt chính là cách đặt dấu ngoặc cho định danh: PostgreSQL dùng dấu ngoặc kép, MySQL dùng dấu backtick. Đối với các thao tác INSERT cơ bản, đầu ra hoạt động được trong cả hai mà không cần sửa đổi.
Điều gì xảy ra nếu CSV của tôi không có hàng tiêu đề?
Công cụ chuyển đổi coi hàng đầu tiên là tiêu đề cột. Nếu CSV của bạn không có tiêu đề, hãy thêm hàng tiêu đề trước khi chuyển đổi, nếu không hàng dữ liệu đầu tiên sẽ trở thành tên cột trong câu lệnh CREATE TABLE. Hầu hết các công cụ chuyển đổi, bao gồm công cụ này, đều yêu cầu có hàng tiêu đề.
Có giới hạn số hàng khi chuyển đổi CSV sang SQL không?
Vì quá trình chuyển đổi chạy trên trình duyệt của bạn, giới hạn thực tế phụ thuộc vào bộ nhớ thiết bị. Các tệp có hàng chục nghìn hàng chuyển đổi mà không gặp vấn đề gì. Đối với tệp rất lớn (500K+ hàng), hãy cân nhắc sử dụng lệnh COPY hoặc LOAD DATA gốc của cơ sở dữ liệu thay vì các câu lệnh INSERT.
Tại sao đầu ra dùng TEXT cho tất cả các cột thay vì INTEGER hay DATE?
CSV là định dạng văn bản thuần túy không có siêu dữ liệu kiểu. Công cụ chuyển đổi dùng TEXT làm mặc định an toàn để tránh suy luận kiểu không chính xác. Bạn có thể thay đổi kiểu cột trong câu lệnh CREATE TABLE được tạo ra sau khi xem lại dữ liệu. INTEGER cho cột số và DATE cho cột ngày tháng là các điều chỉnh thường gặp.
Tôi nên xử lý các tệp CSV dùng dấu chấm phẩy hoặc tab làm dấu phân cách như thế nào?
Công cụ này tự động phát hiện dấu phân cách bằng cách phân tích hàng đầu tiên của CSV. Nó kiểm tra dấu phẩy, dấu chấm phẩy, tab và ký tự pipe, rồi dùng ký tự xuất hiện nhiều nhất. Các tệp CSV định dạng châu Âu dùng dấu chấm phẩy hoạt động mà không cần thay đổi cấu hình.
SQL được tạo ra có an toàn khỏi tấn công injection nếu tôi chạy trực tiếp không?
Đầu ra thoát dấu nháy đơn, giúp ngăn chặn các lỗi cú pháp không mong muốn. Tuy nhiên, nếu dữ liệu CSV của bạn đến từ nguồn không tin cậy, hãy đối xử với SQL được tạo ra giống như bất kỳ đầu vào chưa được kiểm tra nào. Xem lại đầu ra trước khi chạy trên cơ sở dữ liệu sản xuất. Đối với các lần nhập dữ liệu theo chương trình, các truy vấn tham số hóa luôn an toàn hơn so với nối chuỗi.