Vai allo strumento
ViewCSV
Nessun caricamento del file

Convertire un CSV in SQL

orders.csv· DATI DI ESEMPIO15 righe · 8 colonne
Colonne chiave
Obbligatorie per UPSERT, UPDATE e DELETE; usate come chiave primaria quando la tabella viene creata.
Tipi di valore
BEGIN;
CREATE TABLE IF NOT EXISTS "orders" (
  "order_id" TEXT,
  "customer" TEXT,
  "city" TEXT,
  "product" TEXT,
  "quantity" TEXT,
  "unit_price" TEXT,
  "order_date" TEXT,
  "status" TEXT
);
INSERT INTO "orders" ("order_id", "customer", "city", "product", "quantity", "unit_price", "order_date", "status") VALUES
  ('001041', 'Ginevra Marino', 'Bologna', 'Chair, ergonomic', '6', '199.84', '2026-01-21', 'pending'),
  ('001042', 'Leonardo Bianchi', 'Milano', 'Coffee beans 1kg', '9', '162.74', '2026-02-03', 'refunded'),
  ('001043', 'Leonardo Esposito', 'Milano', 'Desk lamp', '2', '85.91', '2026-03-19', 'shipped'),
  ('001044', 'Aurora Bianchi', 'Genova', 'USB-C cable', '6', '24.82', '2026-04-17', 'shipped'),
  ('001045', 'Andrea Greco', 'Torino', 'Desk lamp', '1', NULL, '2026-05-05', 'shipped'),
  ('001046', 'Ginevra Bianchi', 'Torino', 'Monitor 27"', '8', '166.92', '2026-06-21', 'paid'),
  ('001047', ' Ginevra Esposito ', 'Torino', 'Desk lamp', '6', '35.24', '2026-07-17', 'shipped'),
  ('001048', 'Giulia Ferrari', 'Milano', 'USB-C cable', '1', '141.91', '2026-08-12', 'paid'),
  ('001049', 'Aurora Ricci', 'Firenze', 'Notebook A5', '2', '108.07', '2026-09-02', 'paid'),
  ('001050', 'Francesco Gallo', 'Roma', 'USB-C cable', '6', '215.56', '2026-01-15', 'shipped'),
  ('001051', 'Alice Rossi', 'Genova', 'Notebook A5', '5', '126.30', '2026-02-19', 'shipped'),
  ('001052', 'Aurora Romano', 'Torino', 'Coffee beans 1kg', '8', '149.92', '2026-03-18', 'shipped'),
  ('001053', 'Francesco Gallo', 'Torino', 'Coffee beans 1kg', '1', '164.32', '2026-04-10', 'paid'),
  ('001054', 'Giulia Ferrari', 'Napoli', 'Chair, ergonomic', '8', '30.59', '2026-05-14', 'paid'),
  ('001043', 'Leonardo Esposito', 'Milano', 'Desk lamp', '2', '85.91', '2026-03-19', 'shipped');
COMMIT;

15 righe · 1 file

Apri o incolla un file CSV, scegli Database e Istruzione: lo script compare accanto alle opzioni. Per impostazione predefinita è una transazione PostgreSQL con un CREATE TABLE IF NOT EXISTS di colonne TEXT e INSERT da 100 righe ciascuno, così 00412 resta '00412'. Scegli Riconosci numeri e true/false quando la tabella deve avere colonne numeriche, booleane e DATE. Il file viene convertito nel browser e non viene mai caricato.

Come convertire un CSV in SQL

  1. Apri un file .csv, .tsv o .txt, trascinalo sullo strumento oppure incolla le righe. Il delimitatore viene rilevato; in Impostazioni di importazione puoi impostarlo, indicare la riga di intestazione o scegliere una codifica legacy come Windows-1252.
  2. Scegli il Database: PostgreSQL, MySQL / MariaDB, SQLite o SQL Server. Controlla il Nome della tabella, che all’inizio è il nome del file con spazi e punteggiatura trasformati in trattini bassi (sales report.csv diventa sales_report).
  3. Scegli l’Istruzione e, per UPSERT, UPDATE o DELETE, spunta le Colonne chiave che identificano una riga.
  4. Controlla l’anteprima, poi seleziona Copia o scarica il file .sql ed eseguilo con il tuo client del database, per esempio psql -f data.sql.

Per generare gli script di molti file con le stesse impostazioni, scegli Conversione multipla: più file insieme. I file vengono convertiti uno dopo l’altro e gli script si scaricano insieme in un unico ZIP.

Istruzioni e opzioni

INSERTIstruzioni INSERT INTO … VALUES su più righe. Righe per INSERT stabilisce quante righe condividono un’istruzione (da 1 a 1.000, predefinito 100); SQL Server rifiuta più di 1.000 righe.
UPSERT (inserisci o aggiorna)Un’istruzione per riga che la inserisce oppure aggiorna la riga esistente con la stessa chiave: ON CONFLICT (…) DO UPDATE SET … = excluded.… in PostgreSQL e SQLite, ON DUPLICATE KEY UPDATE in MySQL e MERGE in SQL Server. La tabella di destinazione deve avere una chiave primaria o un indice univoco sulle colonne chiave.
UPDATEUPDATE … SET … WHERE key = … per ogni riga; le colonne chiave non vengono modificate. Se tutte le colonne sono chiavi non c’è niente da aggiornare e non viene scritta nessuna istruzione.
DELETEDELETE FROM … WHERE key = … per ogni riga. Un valore di chiave vuoto diventa IS NULL.
Colonne chiaveObbligatorie per UPSERT, UPDATE e DELETE: lo strumento non scrive queste istruzioni senza una chiave nel WHERE. Con Aggiungi CREATE TABLE le colonne chiave diventano NOT NULL e formano la PRIMARY KEY.
Aggiungi CREATE TABLEAttiva per impostazione predefinita. Scrive CREATE TABLE IF NOT EXISTS (un semplice CREATE TABLE per SQL Server o dopo un DROP).
Aggiungi prima DROP TABLE IF EXISTSSostituisce una tabella esistente con lo stesso nome. Disattivata per impostazione predefinita: quando lo script viene eseguito, la vecchia tabella e i suoi dati vanno persi.
Racchiudi in una transazioneAttiva per impostazione predefinita: BEGIN; … COMMIT; (START TRANSACTION; in MySQL, BEGIN TRANSACTION; in SQL Server).
Scrivi le celle vuote come NULLAttiva per impostazione predefinita. Disattivala per scrivere le celle vuote come ''.

Tipi di colonna e virgolette

Con Tratta tutti i valori come testo (predefinito) ogni colonna è TEXT (NVARCHAR(MAX) in SQL Server) e ogni valore è una stringa letterale tra apici: zeri iniziali, codici lunghi e date insolite si caricano senza modifiche.

Con Riconosci numeri e true/false, una colonna riceve un tipo solo se tutti i valori non vuoti vi rientrano:

Numeri interiINTEGER, oppure BIGINT quando un valore ha più di 9 cifre. I valori vengono scritti senza apici. I numeri con zeri iniziali o superiori a 9.007.199.254.740.991 lasciano la colonna come testo.
Decimali (al massimo 15 cifre significative)NUMERIC in PostgreSQL, DECIMAL(p,s) dimensionato in base ai dati in MySQL e SQL Server, REAL in SQLite. Una virgola decimale come in 1,5, tipica dei file italiani, lascia la colonna come testo.
true / false (maiuscole o minuscole)BOOLEAN con TRUE/FALSE in PostgreSQL e MySQL, BIT con 1/0 in SQL Server, INTEGER con 1/0 in SQLite.
Date nel formato YYYY-MM-DDDATE, con valori tra apici come '2026-03-01'; TEXT in SQLite. Data e ora insieme e gli altri formati di data restano testo.
  • I nomi di tabelle e colonne vengono racchiusi tra i delimitatori di identificatore esattamente come sono scritti, quindi spazi, parole riservate e nomi in alfabeti non latini funzionano: "order date" in PostgreSQL e SQLite, ` order date in MySQL, [order date]` in SQL Server. I caratteri di delimitazione presenti nel nome vengono raddoppiati.
  • Nei valori l’apice singolo viene raddoppiato (O'Brien diventa 'O''Brien'). Per MySQL vengono raddoppiate anche le barre rovesciate, perché per impostazione predefinita MySQL tratta \ come carattere di escape. In SQL Server le stringhe ricevono il prefisso N, così il testo Unicode si conserva.
  • Gli a capo dentro un valore CSV tra virgolette restano all’interno della stringa SQL.
  • La maggior parte dei database non può memorizzare i caratteri NUL: vengono rimossi e lo strumento indica quanti erano.

Risoluzione dei problemi

  • Lo script ha tutto in una sola colonna. Il delimitatore è stato riconosciuto male: impostalo in Impostazioni di importazione e riapri il file. I CSV salvati da Excel in italiano usano spesso il punto e virgola.
  • Una colonna numerica è diventata TEXT. Almeno un valore non è un numero semplice, per esempio 12 kg, 1,5 o 007. Trovalo nel Visualizzatore CSV o correggi la colonna con Pulisci CSV.
  • L’UPSERT fallisce per un vincolo mancante. ON CONFLICT e ON DUPLICATE KEY funzionano solo se la tabella di destinazione ha una chiave primaria o un indice univoco sulle colonne chiave. Aggiungi l’indice alla tabella esistente, oppure lascia che sia Aggiungi CREATE TABLE a creare la chiave.
  • MySQL o SQL Server rifiutano la PRIMARY KEY. Una colonna chiave che resta testo viene creata come TEXT (MySQL/MariaDB) o NVARCHAR(MAX) (SQL Server), e nessuno dei due database può indicizzare questi tipi per intero. Crea tu la tabella con una chiave VARCHAR, poi disattiva Aggiungi CREATE TABLE.
  • SQL Server segnala che la tabella esiste già. Gli script per SQL Server usano un semplice CREATE TABLE. Disattiva Aggiungi CREATE TABLE per caricare i dati nella tabella esistente, oppure attiva Aggiungi prima DROP TABLE IF EXISTS per sostituirla.
  • Lo script si interrompe a metà. L’errore del database indica l’istruzione che non è andata a buon fine; di solito si tratta di una chiave duplicata o di un valore che non rientra nel tipo di una colonna di una tabella esistente. Controlla il file con Convalida CSV ed esegui di nuovo lo script.

File grandi e limiti

I file fino a 25 MB, 100.000 righe o 2 milioni di celle si aprono con un’anteprima dal vivo. Quelli più grandi vengono convertiti in streaming: l’anteprima mostra le prime 200 righe, il file viene letto due volte a blocchi (una per ricavare tipi e larghezze delle colonne, una per scrivere lo script) e il download comprende tutte le righe. Un singolo script può arrivare al massimo a 4 GB.

La conversione gira in un worker in background in questa scheda del browser: la pagina resta reattiva e Annulla la interrompe. Il CSV non viene mai inviato a un server. Se invece di uno script vuoi un file di database già pronto, usa Da CSV a SQLite.

Esempio

Un elenco clienti con un ID con zeri iniziali, un nome che contiene un apostrofo e una virgola e un piano vuoto, convertito con le impostazioni predefinite e il nome di tabella customers. Con Riconosci numeri e true/false, signup_date diventa DATE, monthly_fee diventa NUMERIC con 29.00 senza apici e active diventa BOOLEAN con TRUE/FALSE, mentre customer_id resta TEXT.

CSV
customer_id,name,signup_date,plan,monthly_fee,active
00412,"O'Brien, Kate",2026-03-01,pro,29.00,true
00413,Luis Ortega,2026-03-04,,0,false
SQL (PostgreSQL)
BEGIN;
CREATE TABLE IF NOT EXISTS "customers" (
  "customer_id" TEXT,
  "name" TEXT,
  "signup_date" TEXT,
  "plan" TEXT,
  "monthly_fee" TEXT,
  "active" TEXT
);
INSERT INTO "customers" ("customer_id", "name", "signup_date", "plan", "monthly_fee", "active") VALUES
  ('00412', 'O''Brien, Kate', '2026-03-01', 'pro', '29.00', 'true'),
  ('00413', 'Luis Ortega', '2026-03-04', NULL, '0', 'false');
COMMIT;

Domande frequenti

Perché per impostazione predefinita tutte le colonne sono TEXT?

Il CSV non ha tipi e un’ipotesi sbagliata fa perdere dati: un ID come 00412 salvato come intero diventa 412. Come testo si carica esattamente ciò che c’è nel file. Scegli Riconosci numeri e true/false se vuoi colonne numeriche, booleane e DATE.

Con quali database funziona lo script?

PostgreSQL, MySQL e MariaDB, SQLite e SQL Server, ciascuno con le proprie regole per delimitare gli identificatori, fare l’escape delle stringhe, scrivere i booleani e gestire l’upsert. Scegli il Database giusto prima di scaricare: uno script scritto per uno non è portabile sugli altri.

Può generare comandi COPY o LOAD DATA invece degli INSERT?

No. Lo script usa istruzioni standard INSERT, UPSERT, UPDATE o DELETE. Per caricamenti molto grandi valuta lo strumento di caricamento massivo del tuo database, come COPY in PostgreSQL o LOAD DATA in MySQL, che legge direttamente il CSV.

Standard e riferimenti