CSV do SQL

Generuj instrukcje SQL INSERT z danych CSV

Wypróbuj przykład

Wejście CSV

Wyjście SQL

Działa lokalnie · Bezpieczne do wklejania sekretów
SQL pojawi się tutaj…
Nazwa tabeli:

Czym jest konwersja CSV do SQL?

Konwersja CSV do SQL przekształca wartości rozdzielone przecinkami w instrukcje języka SQL, które może wykonać relacyjna baza danych. Najczęstszym wynikiem jest para: instrukcja CREATE TABLE definiująca kolumny oraz jedna lub więcej instrukcji INSERT INTO, które wypełniają te kolumny wierszami z pliku CSV.

Pliki CSV stosują się do specyfikacji RFC 4180. Każda linia to jeden rekord, pola są oddzielone separatorem (zazwyczaj przecinkiem), a pola zawierające separator lub znaki nowej linii są ujmowane w podwójne cudzysłowy. SQL jest z kolei standardowym językiem zarządzania danymi w systemach takich jak PostgreSQL, MySQL, SQLite i SQL Server. Konwersja między tymi dwoma formatami to jedno z najczęstszych zadań importu danych w tworzeniu oprogramowania.

Porządny konwerter CSV-do-SQL obsługuje cytowanie, zmieniając apostrofy wewnątrz wartości na podwojone '' zgodnie ze standardem SQL, mapuje nagłówki kolumn na prawidłowe identyfikatory SQL i opcjonalnie może wnioskować typy danych. Oprócz podstawowego escapowania dobry konwerter normalizuje nazwy nagłówków (zastępując spacje i myślniki podkreślnikami) oraz opakowuje wynik w blok transakcji, dzięki czemu błąd importu cofa zmiany bez pozostawiania niepełnych danych w tabeli. Bez konwertera ręczne pisanie instrukcji INSERT nawet dla kilkuset wierszy jest podatne na błędy i czasochłonne.

Dlaczego warto używać konwertera CSV do SQL?

Ręczne pisanie instrukcji SQL INSERT z danych arkusza kalkulacyjnego jest żmudne i sprzyja błędom składniowym. Konwerter automatyzuje powtarzalne czynności, dzięki czemu możesz skupić się na projektowaniu schematu i walidacji danych.

Generuj SQL w kilka sekund
Wklej CSV i uzyskaj gotowy do uruchomienia wynik SQL. Nie musisz ręcznie ujmować ciągów w cudzysłowy, escapować apostrofów ani liczyć kolumn. Konwersja odbywa się w całości w przeglądarce.
🔒
Dane pozostają w przeglądarce
Twój plik CSV nigdy nie opuszcza Twojego komputera. Całe przetwarzanie i generowanie SQL odbywa się po stronie klienta — bez przesyłania na serwer, bez logowania i bez dostępu osób trzecich do Twoich danych.
🎯
Poprawna składnia SQL
Apostrofy wewnątrz wartości są escapowane jako '' zgodnie ze standardem SQL. Nazwy kolumn są przekształcane na prawidłowe identyfikatory. Wynik jest składniowo poprawny dla PostgreSQL, MySQL i SQLite.
📋
Obsługa dowolnej struktury CSV
Narzędzie automatycznie wykrywa separatory (przecinek, średnik, tabulator, kreska pionowa) i obsługuje pola w cudzysłowach zawierające osadzone przecinki lub znaki nowej linii zgodnie z zasadami RFC 4180.

Przypadki użycia konwertera CSV do SQL

Inicjowanie bazy danych
Przekształć plik CSV z danymi testowymi w instrukcje INSERT dla baz danych deweloperskich lub stagingowych. Przydatne w pipeline'ach CI, gdzie potrzebne są powtarzalne dane bez użycia ORM.
Migracja danych
Przenieś dane wyeksportowane z jednego systemu (CRM, arkusz kalkulacyjny, stara aplikacja) do nowej relacyjnej bazy danych. Wygeneruj SQL, przejrzyj go, a następnie uruchom w transakcji.
Tworzenie backend API
Szybko wypełnij lokalną instancję PostgreSQL lub MySQL danymi testowymi z pliku CSV. Szybsze niż pisanie skryptu migracyjnego, gdy potrzebne jest jednorazowe załadowanie danych.
QA i automatyzacja testów
Generuj SQL z plików CSV z danymi testowymi, aby przygotować stan bazy danych przed testami integracyjnymi. Połącz z skryptem czyszczącym, aby resetować tabelę między kolejnymi uruchomieniami testów.
Przygotowanie analizy danych
Załaduj zestawy danych CSV do SQLite dla doraźnych zapytań. SQLite odczytuje instrukcje SQL INSERT bezpośrednio, co pozwala szybko przejść od eksportu arkusza kalkulacyjnego do danych gotowych do zapytań.
Nauka SQL
Studenci mogą konwertować przykładowe pliki CSV do SQL, aby ćwiczyć zapytania SELECT, JOIN i agregacje na danych wyglądających realistycznie bez konieczności tworzenia schematu od zera.

Typy danych SQL — wykaz

Podczas konwersji CSV do SQL każda kolumna domyślnie otrzymuje typ TEXT, ponieważ CSV nie zawiera metadanych o typach. Jeśli znasz typy kolumn, możesz zastąpić TEXT w wygenerowanej instrukcji CREATE TABLE. Ta tabela przedstawia najczęstsze typy SQL i kiedy należy ich używać.

TypZastosowanieUwagi
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

Porównanie dialektów SQL

Składnia SQL różni się między silnikami baz danych. Wygenerowane instrukcje INSERT używają standardowego SQL działającego w większości systemów, jednak niektóre funkcje się różnią. Ta tabela podsumowuje różnice najważniejsze przy imporcie danych CSV.

FunkcjaPostgreSQLMySQLSQLiteSQL 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: wybór metody importu

W przypadku małych i średnich zestawów danych (poniżej 10 000 wierszy) instrukcje INSERT działają dobrze i są przenośne na każdą bazę danych SQL. Dla dużych importów bazy danych udostępniają polecenia masowego ładowania, które całkowicie omijają parser SQL.

INSERT INTO
Standardowy SQL. Działa wszędzie. Każdy wiersz jest przetwarzany jako instrukcja SQL, więc narzut jest większy przy dużych zestawach danych. Obsługuje logikę warunkową (ON CONFLICT, ON DUPLICATE KEY). Najlepszy do danych inicjujących, małych migracji i przypadków wymagających kontroli na poziomie wiersza.
COPY / LOAD DATA
Masowe ładowanie specyficzne dla bazy danych. PostgreSQL używa COPY, MySQL — LOAD DATA INFILE, SQLite — .import, a SQL Server — BULK INSERT. Odczytuje CSV bezpośrednio, pomijając parser SQL. Od 10 do 100 razy szybsze dla dużych plików (powyżej 100 tys. wierszy). Wymaga dostępu do systemu plików po stronie serwera lub klienta.

Przykłady kodu

Te przykłady pokazują, jak konwertować CSV na instrukcje SQL INSERT w różnych językach programowania. Każdy z nich obsługuje escapowanie apostrofów i oczyszczanie nazw kolumn.

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

Często zadawane pytania

Jak apostrofy w wartościach CSV są obsługiwane w wynikowym SQL?
Każdy apostrof (') w wartości CSV jest podwajany do '' w wynikowym SQL. Jest to standardowa sekwencja ucieczki w SQL. Na przykład wartość "O'Brien" staje się 'O''Brien' w instrukcji INSERT. Działa to w PostgreSQL, MySQL, SQLite i SQL Server.
Czy mogę konwertować CSV do SQL dla konkretnej bazy danych, takiej jak MySQL lub PostgreSQL?
Wygenerowane instrukcje INSERT używają standardowej składni SQL akceptowanej zarówno przez MySQL, jak i PostgreSQL. Główna różnica dotyczy cytowania identyfikatorów: PostgreSQL używa podwójnych cudzysłowów, MySQL — apostrofów odwrotnych. W przypadku podstawowych operacji INSERT wynik działa w obu systemach bez modyfikacji.
Co się stanie, jeśli mój plik CSV nie ma wiersza nagłówka?
Konwerter traktuje pierwszy wiersz jako nagłówki kolumn. Jeśli plik CSV nie zawiera nagłówków, dodaj wiersz nagłówkowy przed konwersją, w przeciwnym razie pierwszy wiersz danych stanie się nazwami kolumn w instrukcji CREATE TABLE. Większość konwerterów, w tym ten, wymaga wiersza nagłówkowego.
Czy istnieje limit wierszy przy konwersji CSV do SQL?
Ponieważ konwersja odbywa się w przeglądarce, praktyczny limit zależy od pamięci urządzenia. Pliki z dziesiątkami tysięcy wierszy są konwertowane bez problemów. W przypadku bardzo dużych plików (powyżej 500 tys. wierszy) rozważ użycie natywnego polecenia COPY lub LOAD DATA bazy danych zamiast instrukcji INSERT.
Dlaczego wynik używa TEXT dla wszystkich kolumn zamiast INTEGER lub DATE?
CSV to format zwykłego tekstu bez metadanych o typach. Konwerter używa TEXT jako bezpiecznego domyślnego, aby uniknąć błędnego wnioskowania o typach. Możesz zmienić typy kolumn w wygenerowanej instrukcji CREATE TABLE po przejrzeniu danych. Typowe korekty to INTEGER dla kolumn numerycznych i DATE dla kolumn z datami.
Jak obsługiwać pliki CSV ze średnikami lub tabulatorami jako separatorami?
To narzędzie automatycznie wykrywa separator, analizując pierwszy wiersz pliku CSV. Sprawdza przecinki, średniki, tabulatory i pionowe kreski, a następnie używa tego, który pojawia się najczęściej. Pliki CSV w formacie europejskim używające średników działają bez żadnej zmiany konfiguracji.
Czy wygenerowany SQL jest bezpieczny przed wstrzyknięciem, jeśli uruchamiam go bezpośrednio?
Wynik escapuje apostrofy, co zapobiega przypadkowym błędom składniowym. Jednak jeśli dane CSV pochodzą z niezaufanego źródła, traktuj wygenerowany SQL tak samo jak każde inne niezweryfikowane dane wejściowe. Przejrzyj wynik przed uruchomieniem go w produkcyjnej bazie danych. W przypadku programowych importów sparametryzowane zapytania są zawsze bezpieczniejsze niż łączenie ciągów.