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
- Apri un file
.csv,.tsvo.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. - 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.csvdiventasales_report). - Scegli l’Istruzione e, per UPSERT, UPDATE o DELETE, spunta le Colonne chiave che identificano una riga.
- Controlla l’anteprima, poi seleziona Copia o scarica il file
.sqled eseguilo con il tuo client del database, per esempiopsql -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
| INSERT | Istruzioni 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. |
| UPDATE | UPDATE … 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. |
| DELETE | DELETE FROM … WHERE key = … per ogni riga. Un valore di chiave vuoto diventa IS NULL. |
| Colonne chiave | Obbligatorie 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 TABLE | Attiva 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 EXISTS | Sostituisce 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 transazione | Attiva per impostazione predefinita: BEGIN; … COMMIT; (START TRANSACTION; in MySQL, BEGIN TRANSACTION; in SQL Server). |
| Scrivi le celle vuote come NULL | Attiva 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 interi | INTEGER, 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-DD | DATE, 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 datein MySQL,[order date]` in SQL Server. I caratteri di delimitazione presenti nel nome vengono raddoppiati. - Nei valori l’apice singolo viene raddoppiato (
O'Briendiventa'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 prefissoN, 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,5o007. Trovalo nel Visualizzatore CSV o correggi la colonna con Pulisci CSV. - L’UPSERT fallisce per un vincolo mancante.
ON CONFLICTeON DUPLICATE KEYfunzionano 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) oNVARCHAR(MAX)(SQL Server), e nessuno dei due database può indicizzare questi tipi per intero. Crea tu la tabella con una chiaveVARCHAR, 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.
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
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.