Chuyển CSV sang câu lệnh INSERT cho MySQL, PostgreSQL, SQL Server và SQLite
Công cụ nhận bảng dữ liệu dạng CSV từ ô dán hoặc từ tệp tải lên, tự đoán kiểu của từng cột rồi sinh câu lệnh INSERT đúng cú pháp thoát chuỗi của hệ quản trị bạn chọn. Có thêm tùy chọn gộp nhiều dòng vào một câu, chia lô, sinh kèm CREATE TABLE và mệnh đề xử lý trùng khóa.
Tính năng nổi bật
- Nhận CSV từ ô dán hoặc tệp tải lên, đọc được cả trường có dấu nháy kép và dấu phân cách nằm trong nội dung
- Bốn dấu phân cách: dấu phẩy, dấu chấm phẩy, tab và dấu gạch đứng, kèm nút đoán tự động từ dòng đầu
- Đoán kiểu từng cột thành số nguyên, số thực, boolean, ngày, ngày giờ hoặc chuỗi, ô rỗng thành NULL
- Bốn hệ quản trị với cách thoát chuỗi và cách bọc tên bảng riêng: MySQL, PostgreSQL, SQL Server, SQLite
- Gộp nhiều dòng vào một câu INSERT và chia lô theo số dòng bạn đặt, tự hạ về 1000 dòng khi chọn SQL Server
- Sinh kèm câu CREATE TABLE với kiểu dữ liệu và ràng buộc NOT NULL suy ra từ chính dữ liệu
- Mệnh đề upsert theo từng hệ: ON DUPLICATE KEY UPDATE, ON CONFLICT DO UPDATE, DO NOTHING và INSERT IGNORE
- Bảng tóm tắt kiểu đoán được cho từng cột, kèm cảnh báo về dòng lệch số cột và cột giữ số 0 ở đầu
Vì sao không nên viết tay câu INSERT từ tệp CSV
Nạp một tệp CSV vài trăm dòng vào database nghe rất đơn giản cho tới lúc gặp dòng có dấu nháy trong tên riêng, ô ngày tháng ghi theo kiểu Việt Nam, hoặc số điện thoại bắt đầu bằng số 0. Viết tay thì mất hàng giờ, dùng chức năng nhập tệp của trình quản trị thì lại đòi quyền tải tệp lên máy chủ và không phải môi trường nào cũng cho. Còn dùng lệnh nhập của từng hệ quản trị thì mỗi hệ một cú pháp: MySQL có LOAD DATA INFILE, PostgreSQL có COPY, SQL Server có BULK INSERT, và cả ba đều đòi tệp phải nằm sẵn trên máy chủ. Câu INSERT thuần là mẫu số chung chạy được ở mọi nơi: dán vào cửa sổ truy vấn, đưa vào tệp migration, gửi cho quản trị viên chạy giúp, hay nhét vào tập lệnh khởi tạo dữ liệu mẫu cho môi trường kiểm thử. Công cụ này lo phần cực nhất là thoát chuỗi và đoán kiểu, phần bạn cần làm chỉ là chọn hệ quản trị và tên bảng.
Lợi ích khi sử dụng
- Không phải cài công cụ nhập liệu hay xin quyền tải tệp lên máy chủ database
- Cùng một tệp CSV sinh được bốn phương ngữ SQL khác nhau chỉ bằng một lần chọn
- Nhìn thấy kiểu dữ liệu đoán được trước khi chạy, tránh cột số điện thoại bị mất số 0 đầu
- Tệp CSV không rời khỏi máy vì mọi xử lý chạy bằng JavaScript trên trình duyệt
- Chia lô sẵn giúp câu lệnh không vượt giới hạn gói tin của MySQL hay giới hạn 1000 dòng của SQL Server
Cách chuyển CSV sang câu lệnh INSERT
- 1Dán nội dung CSV vào ô văn bản hoặc bấm chọn tệp để tải lên, dấu phân cách sẽ được đoán tự động từ tệp.
- 2Kiểm tra công tắc dòng đầu tiên là tiêu đề cột, tắt đi nếu tệp của bạn không có dòng tiêu đề.
- 3Nhập tên bảng đích và chọn hệ quản trị, cách bọc tên bảng cùng cách viết boolean đổi theo lựa chọn này.
- 4Xem lại bảng kiểu dữ liệu đoán được cho từng cột, đây là bước phát hiện sớm cột bị đoán sai kiểu.
- 5Bật các tùy chọn cần thiết như gộp nhiều dòng, chia lô, sinh kèm CREATE TABLE hoặc mệnh đề xử lý trùng khóa, rồi chép câu lệnh hoặc tải về tệp .sql.
Quy tắc đoán kiểu dữ liệu và lý do số 0 ở đầu được giữ nguyên
Công cụ quét toàn bộ giá trị của một cột rồi mới quyết định kiểu, chứ không nhìn mỗi dòng đầu tiên. Thứ tự xét như sau. Trước hết, ô rỗng cùng các chuỗi null, nil, none, n/a và ký hiệu \N của PostgreSQL được coi là giá trị thiếu và sẽ sinh ra từ khóa NULL không có dấu nháy. Tiếp theo, nếu mọi giá trị còn lại đều nằm trong nhóm true, false, yes, no, t, f thì cột là boolean. Sau đó tới số nguyên, với một ngoại lệ quan trọng: nếu có bất kỳ giá trị nào bắt đầu bằng số 0 và dài hơn một chữ số, cả cột bị đẩy về kiểu chuỗi. Đây là quy tắc cứu sống cột số điện thoại, mã bưu chính, mã số thuế và số tài khoản của Việt Nam, vì lưu chúng thành số sẽ mất số 0 đầu và không cách nào khôi phục. Cột số thực chỉ được nhận khi có ít nhất một giá trị mang dấu chấm thập phân. Cuối cùng là ngày giờ rồi tới ngày, chấp nhận cả dạng năm-tháng-ngày lẫn dạng ngày/tháng/năm quen dùng ở Việt Nam, và cả hai được chuẩn hóa về dạng ISO trước khi đưa vào câu lệnh. Không khớp nhóm nào thì cột là chuỗi.
Bốn hệ quản trị khác nhau ở đúng những chỗ nào
Khác biệt đầu tiên là cách bọc tên bảng và tên cột. MySQL dùng dấu huyền, SQL Server dùng cặp ngoặc vuông, còn PostgreSQL và SQLite dùng dấu nháy kép theo chuẩn SQL. Chọn sai kiểu bọc thì câu lệnh báo lỗi cú pháp ngay dòng đầu. Khác biệt thứ hai là cách thoát dấu nháy đơn trong chuỗi. Chuẩn SQL quy định nhân đôi dấu nháy, và ba hệ đều theo chuẩn đó. Riêng MySQL với cấu hình mặc định còn coi dấu chéo ngược là ký tự thoát, nên một chuỗi kết thúc bằng dấu chéo ngược có thể nuốt luôn dấu nháy đóng và làm hỏng cả câu lệnh, vì vậy công cụ nhân đôi dấu chéo ngược khi bạn chọn MySQL. Khác biệt thứ ba là kiểu boolean: PostgreSQL có kiểu BOOLEAN thật nên sinh ra TRUE và FALSE, còn MySQL lưu vào TINYINT, SQL Server lưu vào BIT và SQLite lưu vào INTEGER nên đều sinh ra số 1 và số 0. Khác biệt cuối là mệnh đề xử lý trùng khóa, mỗi hệ một cú pháp riêng và SQL Server thì không có mệnh đề nào tương đương.
Gộp dòng, chia lô và các giới hạn kỹ thuật cần biết trước khi chạy
Một câu INSERT một dòng cho một trăm nghìn dòng dữ liệu là cách chậm nhất có thể, vì mỗi câu là một lượt phân tích cú pháp và thường là một giao dịch riêng. Gộp nhiều dòng vào một câu giảm mạnh chi phí đó, nhưng không thể gộp vô hạn. MySQL giới hạn kích thước một gói tin bằng tham số max_allowed_packet, mặc định thường là 64 mê ga byte ở các bản mới và chỉ 4 mê ga byte ở nhiều bản cũ; câu lệnh vượt ngưỡng sẽ bị ngắt kết nối chứ không báo lỗi cú pháp, khiến người mới rất khó đoán nguyên nhân. SQL Server có giới hạn cứng và rõ ràng hơn: một mệnh đề VALUES chỉ nhận tối đa một nghìn dòng, nên công cụ tự hạ kích thước lô về mức này khi bạn chọn SQL Server. PostgreSQL và SQLite không có trần cố định nhưng vẫn nên chia lô để câu lệnh không phình quá lớn trong bộ nhớ. Mức một trăm tới năm trăm dòng mỗi lô là vùng an toàn cho hầu hết trường hợp. Với tệp lớn, hãy tải tệp .sql về rồi chạy bằng công cụ dòng lệnh thay vì dán vào trình quản trị chạy trên trình duyệt.
Upsert: cùng một ý tưởng, bốn cách viết và một hệ không có
Upsert nghĩa là chèn dòng mới nếu chưa có, còn nếu đã có thì cập nhật. Cách viết khác nhau theo từng hệ. PostgreSQL và SQLite dùng cùng cấu trúc ON CONFLICT với cột khóa đặt trong ngoặc, sau đó chọn DO NOTHING để bỏ qua hoặc DO UPDATE SET để cập nhật, trong đó giá trị mới được tham chiếu qua bảng ảo tên EXCLUDED ở PostgreSQL và excluded ở SQLite. MySQL không cần nêu tên cột khóa mà dựa vào mọi ràng buộc duy nhất đang có, viết là ON DUPLICATE KEY UPDATE với hàm VALUES để lấy giá trị mới, hoặc dùng INSERT IGNORE để bỏ qua dòng trùng. Một điểm cần nhớ là cả hai cách của MySQL và PostgreSQL chỉ hoạt động khi cột khóa bạn chọn đã có ràng buộc PRIMARY KEY hoặc UNIQUE trong bảng đích; nếu chưa có, câu lệnh sẽ báo lỗi hoặc âm thầm chèn thêm dòng trùng. SQL Server không có cú pháp một dòng nào tương đương, cách chính thống là nạp dữ liệu vào bảng tạm rồi chạy lệnh MERGE, nên công cụ chỉ chèn ghi chú nhắc bạn hướng đi này.
Những cái bẫy thường gặp khi nạp CSV tiếng Việt vào database
Bẫy thứ nhất là bảng mã. Tệp CSV xuất từ Excel bản tiếng Việt thường lưu theo bảng mã cũ chứ không phải UTF-8, mở lên thấy chữ có dấu biến thành ký tự lạ. Hãy lưu lại bằng tùy chọn CSV UTF-8 trước khi dán vào đây. Bẫy thứ hai là bảng đích chưa dùng bộ ký tự đủ rộng: với MySQL, bộ utf8 cũ chỉ lưu được ba byte cho một ký tự nên biểu tượng cảm xúc và một số ký tự hiếm bị cắt, phải dùng utf8mb4, và câu CREATE TABLE mà công cụ sinh ra đã đặt sẵn bộ này. Bẫy thứ ba là dấu phân cách: máy tính đặt vùng Việt Nam thường xuất CSV bằng dấu chấm phẩy vì dấu phẩy đã dùng làm dấu thập phân, nên nếu dán vào mà thấy chỉ có một cột thì hãy đổi dấu phân cách hoặc bấm nút đoán. Bẫy thứ tư là số có dấu ngăn cách hàng nghìn như 1.500.000; những giá trị này bị coi là chuỗi, hãy bỏ dấu ngăn cách trong tệp nguồn trước khi chuyển. Bẫy cuối là dòng thiếu cột do ô cuối bị bỏ trống, công cụ sẽ bù chuỗi rỗng và báo số dòng bị lệch để bạn kiểm tra lại nguồn.
Câu hỏi thường gặp (FAQ)
Tệp CSV của tôi có được gửi lên máy chủ không?
Không. Tệp được đọc bằng trình đọc tệp của trình duyệt và toàn bộ việc phân tích, đoán kiểu, sinh câu lệnh đều chạy bằng JavaScript ngay trên máy bạn. Không có lời gọi mạng nào trong quá trình này, kể cả khi bạn bấm tải tệp .sql về.
Vì sao cột số điện thoại lại thành kiểu chuỗi thay vì số?
Vì có giá trị bắt đầu bằng số 0 và dài hơn một chữ số. Nếu lưu thành số nguyên, số 0 ở đầu sẽ mất và 0903123456 thành 903123456. Quy tắc này áp dụng cho cả mã bưu chính, mã số thuế và số tài khoản, và không có cách nào khôi phục số 0 sau khi đã nạp sai.
Ô để trống trong CSV sẽ thành NULL hay thành chuỗi rỗng?
Thành NULL không có dấu nháy. Các chuỗi null, nil, none, n/a và ký hiệu \N cũng được hiểu là giá trị thiếu. Nếu bạn thực sự muốn chuỗi rỗng thay vì NULL, hãy điền một ký tự đại diện vào tệp nguồn rồi cập nhật lại sau khi nạp.
Chọn MySQL và PostgreSQL thì câu lệnh khác nhau chỗ nào?
Khác ở ba chỗ: MySQL bọc tên bảng bằng dấu huyền còn PostgreSQL bằng dấu nháy kép; MySQL nhân đôi cả dấu chéo ngược khi thoát chuỗi còn PostgreSQL chỉ nhân đôi dấu nháy đơn; boolean ở MySQL viết thành 1 và 0 còn PostgreSQL viết thành TRUE và FALSE.
Nên đặt bao nhiêu dòng cho mỗi lô?
Một trăm tới năm trăm dòng là vùng an toàn cho hầu hết trường hợp. Với SQL Server, giới hạn cứng là một nghìn dòng cho một mệnh đề VALUES nên công cụ tự hạ xuống mức đó. Với MySQL, lô quá lớn có thể vượt tham số max_allowed_packet và bị ngắt kết nối giữa chừng.
Câu ON DUPLICATE KEY UPDATE chạy mà không cập nhật gì, vì sao?
Nhiều khả năng cột bạn chọn làm khóa xét trùng chưa có ràng buộc PRIMARY KEY hoặc UNIQUE trong bảng đích. Không có ràng buộc thì database không coi dòng nào là trùng, nên mọi dòng đều được chèn mới. Hãy thêm ràng buộc duy nhất cho cột đó trước khi chạy.
Vì sao SQL Server không có tùy chọn upsert?
Vì T-SQL không có mệnh đề nào tương đương ON CONFLICT hay ON DUPLICATE KEY. Cách làm chuẩn là nạp dữ liệu vào bảng tạm rồi chạy lệnh MERGE để so khớp và cập nhật. Khi bạn chọn SQL Server kèm upsert, công cụ chèn ghi chú nhắc lại hướng đi này ở đầu tệp kết quả.
Ngày tháng ghi kiểu 15/03/2024 có nhận được không?
Có. Công cụ nhận cả dạng ngày/tháng/năm quen dùng ở Việt Nam lẫn dạng năm-tháng-ngày theo chuẩn ISO, và chuẩn hóa hết về dạng ISO trước khi đưa vào câu lệnh vì mọi hệ quản trị đều hiểu dạng này. Chỉ khi cả cột đều đúng khuôn thì cột mới được nhận là kiểu ngày.
Chữ tiếng Việt bị lỗi thành ký tự lạ sau khi nạp thì xử lý sao?
Có hai nguyên nhân. Một là tệp CSV không lưu theo UTF-8, hãy xuất lại từ Excel bằng tùy chọn CSV UTF-8. Hai là bảng đích dùng bộ ký tự cũ, với MySQL hãy chuyển cột sang utf8mb4; câu CREATE TABLE mà công cụ sinh ra đã đặt sẵn bộ ký tự này.
Câu CREATE TABLE sinh ra có kèm khóa chính không?
Không. Công cụ chỉ suy được kiểu dữ liệu và tính có thể rỗng từ chính dữ liệu, còn khóa chính, khóa ngoại, chỉ mục và giá trị mặc định là quyết định thiết kế mà dữ liệu không nói được. Hãy xem câu CREATE TABLE như bản nháp rồi bổ sung ràng buộc bằng tay.
Tệp bao nhiêu dòng thì công cụ còn chạy mượt?
Vài nghìn dòng chạy tức thì. Từ khoảng năm nghìn dòng trở lên, kết quả vẫn đúng nhưng ô văn bản hiển thị bắt đầu nặng, khi đó nên tải tệp .sql về rồi chạy bằng công cụ dòng lệnh. Với tệp hàng trăm nghìn dòng, hãy cân nhắc lệnh nhập hàng loạt riêng của từng hệ quản trị.
Công cụ này khác gì trang tạo câu CREATE TABLE trên site?
Trang này lo phần dữ liệu, nhận bảng CSV có sẵn và sinh câu lệnh nạp dữ liệu vào bảng đã tồn tại. Trang SQL Create Table Generator lo phần cấu trúc, giúp bạn khai báo cột, kiểu, khóa và ràng buộc khi thiết kế bảng mới từ đầu. Hai việc khác nhau nên dùng hai công cụ khác nhau.
Từ khóa liên quan
- chuyển csv sang sql
- csv to sql insert online
- tạo câu lệnh insert từ excel
- import csv vào mysql
- import csv vào postgresql
- sinh câu insert nhiều dòng
- on duplicate key update mysql
- on conflict do update postgresql
- insert ignore là gì
- escape dấu nháy trong sql
- max_allowed_packet mysql
- giới hạn 1000 dòng insert sql server
- csv utf-8 lỗi font tiếng việt
- utf8mb4 mysql tiếng việt
- giữ số 0 đầu số điện thoại
- chuyển csv sang sqlite
- tạo create table từ csv
- công cụ chuyển csv sang sql miễn phí
- nạp dữ liệu mẫu vào database
- chia lô câu lệnh insert
