Ouvrez ou collez un fichier CSV, choisissez la Base de données et l’Instruction : le script s’affiche à côté des options. Par défaut, il s’agit d’une transaction PostgreSQL avec un CREATE TABLE IF NOT EXISTS à colonnes TEXT et des INSERT de 100 lignes chacun : 00412 reste donc '00412'. Choisissez Détecter les nombres et true/false si la table doit recevoir des colonnes numériques, booléennes et DATE. La conversion a lieu dans votre navigateur, sans jamais envoyer le fichier.
Convertir un CSV en SQL, étape par étape
- Ouvrez un fichier
.csv,.tsvou.txt, déposez-le sur l’outil ou collez des lignes. Le séparateur est détecté ; réglez-le, ainsi que la ligne d’en-têtes ou un encodage ancien comme Windows-1252, dans Paramètres d’importation. - Choisissez la Base de données : PostgreSQL, MySQL / MariaDB, SQLite ou SQL Server. Vérifiez le Nom de la table : par défaut, c’est le nom du fichier, dont les espaces et la ponctuation deviennent des traits de soulignement (
sales report.csvdevientsales_report). - Choisissez l’Instruction et, pour UPSERT, UPDATE ou DELETE, cochez les Colonnes clés qui identifient une ligne.
- Relisez l’aperçu, puis choisissez Copier ou téléchargez le fichier
.sqlet exécutez-le avec votre client de base de données, par exemplepsql -f data.sql.
Pour générer les scripts de nombreux fichiers avec les mêmes réglages, choisissez Lot : convertir plusieurs fichiers. Chaque fichier est converti à son tour et les scripts sont téléchargés ensemble dans un seul ZIP.
Instructions et options
| INSERT | Des instructions INSERT INTO … VALUES à plusieurs lignes. Lignes par INSERT fixe le nombre de lignes regroupées dans une même instruction (de 1 à 1 000, 100 par défaut) ; SQL Server en refuse plus de 1 000. |
|---|---|
| UPSERT (insérer ou mettre à jour) | Une instruction par ligne, qui l’insère ou met à jour la ligne existante de même clé : ON CONFLICT (…) DO UPDATE SET … = excluded.… dans PostgreSQL et SQLite, ON DUPLICATE KEY UPDATE dans MySQL, et MERGE dans SQL Server. La table cible doit avoir une clé primaire ou un index unique sur les colonnes clés. |
| UPDATE | UPDATE … SET … WHERE key = … pour chaque ligne ; les colonnes clés ne sont pas modifiées. Si toutes les colonnes sont des clés, il n’y a rien à mettre à jour et aucune instruction n’est écrite. |
| DELETE | DELETE FROM … WHERE key = … pour chaque ligne. Une valeur de clé vide devient IS NULL. |
| Colonnes clés | Obligatoires pour UPSERT, UPDATE et DELETE ; l’outil n’écrit jamais l’une de ces instructions sans clé dans le WHERE. Avec Ajouter CREATE TABLE, les colonnes clés deviennent NOT NULL et forment la PRIMARY KEY. |
| Ajouter CREATE TABLE | Activé par défaut. Écrit CREATE TABLE IF NOT EXISTS (un simple CREATE TABLE pour SQL Server, ou après un DROP). |
| Commencer par DROP TABLE IF EXISTS | Remplace une table existante de même nom. Désactivé par défaut ; l’ancienne table et ses données sont perdues à l’exécution du script. |
| Encadrer dans une transaction | Activé par défaut : BEGIN; … COMMIT; (START TRANSACTION; dans MySQL, BEGIN TRANSACTION; dans SQL Server). |
| Écrire les cellules vides en NULL | Activé par défaut. Désactivez cette option pour écrire les cellules vides sous la forme ''. |
Types de colonnes et guillemets
Avec Tout garder en texte (le réglage par défaut), chaque colonne est de type TEXT (NVARCHAR(MAX) dans SQL Server) et chaque valeur est une chaîne littérale entre apostrophes : zéros initiaux, identifiants longs et dates atypiques sont chargés sans changement.
Avec Détecter les nombres et true/false, une colonne ne reçoit un type que si toutes ses valeurs non vides y correspondent :
| Nombres entiers | INTEGER, ou BIGINT si une valeur dépasse 9 chiffres. Les valeurs sont écrites sans apostrophes. Des nombres à zéros initiaux ou au-delà de 9 007 199 254 740 991 laissent la colonne en texte. |
|---|---|
| Décimaux (15 chiffres significatifs au plus) | NUMERIC dans PostgreSQL, DECIMAL(p,s) dimensionné d’après les données dans MySQL et SQL Server, REAL dans SQLite. Une virgule décimale comme 1,5 laisse la colonne en texte. |
| true / false (quelle que soit la casse) | BOOLEAN avec TRUE/FALSE dans PostgreSQL et MySQL, BIT avec 1/0 dans SQL Server, INTEGER avec 1/0 dans SQLite. |
| Dates au format AAAA-MM-JJ | DATE, avec des valeurs entre apostrophes comme '2026-03-01' ; TEXT dans SQLite. Les dates-heures et les autres formats de date restent du texte. |
- Les noms de tables et de colonnes sont entourés de délimiteurs exactement tels qu’ils sont écrits : espaces, mots réservés et noms non latins fonctionnent donc —
"order date"dans PostgreSQL et SQLite, `order datedans MySQL,[order date]` dans SQL Server. Les délimiteurs présents dans les noms sont doublés. - Dans les valeurs, une apostrophe est doublée (
O'Briendevient'O''Brien'). Pour MySQL, les barres obliques inverses sont doublées aussi, car MySQL traite\comme un caractère d’échappement par défaut. Les littéraux SQL Server reçoivent le préfixeNpour conserver le texte Unicode. - Les sauts de ligne à l’intérieur d’une valeur CSV entre guillemets restent dans la chaîne littérale SQL.
- La plupart des bases de données ne peuvent pas stocker les caractères NUL : ils sont supprimés et l’outil indique combien.
En cas de problème
- Le script ne contient qu’une seule colonne. Le séparateur a été mal deviné ; réglez-le dans Paramètres d’importation et rouvrez le fichier.
- Une colonne de nombres est sortie en TEXT. Au moins une valeur n’est pas un nombre simple, par exemple
12 kg,1,5ou007. Retrouvez-la dans le lecteur CSV ou corrigez la colonne avec Nettoyer un CSV. - L’UPSERT échoue faute de contrainte.
ON CONFLICTetON DUPLICATE KEYne fonctionnent que si la table cible a une clé primaire ou un index unique sur les colonnes clés. Ajoutez l’index à la table existante, ou laissez Ajouter CREATE TABLE créer la clé. - MySQL ou SQL Server refuse la PRIMARY KEY. Une colonne clé restée en texte est créée en
TEXT(MySQL/MariaDB) ou enNVARCHAR(MAX)(SQL Server), et aucune de ces bases ne peut indexer entièrement ces types. Créez vous-même la table avec une cléVARCHAR, puis désactivez Ajouter CREATE TABLE. - SQL Server signale que la table existe déjà. Les scripts SQL Server utilisent un simple
CREATE TABLE. Désactivez Ajouter CREATE TABLE pour charger les données dans la table existante, ou activez Commencer par DROP TABLE IF EXISTS pour la remplacer. - Le script s’arrête en cours de route. L’erreur de la base de données nomme l’instruction en cause ; les causes habituelles sont une clé en double ou une valeur qui ne correspond pas au type d’une colonne d’une table existante. Contrôlez le fichier avec Valider un CSV et relancez le script.
Gros fichiers et limites
Les fichiers jusqu’à 25 Mo, 100 000 lignes ou 2 millions de cellules s’ouvrent avec un aperçu en direct. Les fichiers plus gros sont convertis en flux : l’aperçu montre les 200 premières lignes, le fichier est lu deux fois par morceaux (une fois pour déterminer les types et largeurs des colonnes, une fois pour écrire le script), et le téléchargement couvre toutes les lignes. Un script est plafonné à 4 Go.
La conversion s’exécute dans un worker en arrière-plan, dans cet onglet : la page reste réactive et Annuler l’interrompt. Le CSV n’est jamais envoyé sur un serveur. Pour obtenir un fichier de base de données prêt à l’emploi plutôt qu’un script, utilisez CSV en SQLite.
Exemple
Une liste de clients avec un identifiant à zéros initiaux, un nom contenant une apostrophe et une virgule, et une formule vide, convertie avec les réglages par défaut et le nom de table customers. Avec Détecter les nombres et true/false, signup_date devient DATE, monthly_fee devient NUMERIC avec 29.00 sans apostrophes, et active devient BOOLEAN avec TRUE/FALSE, tandis que customer_id reste en 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;Questions fréquentes
Pourquoi toutes les colonnes sont-elles en TEXT par défaut ?
Le CSV n’a pas de types, et une mauvaise supposition fait perdre des données : un identifiant comme 00412 stocké en entier devient 412. Le texte charge exactement ce que dit le fichier. Choisissez Détecter les nombres et true/false si vous voulez des colonnes numériques, booléennes et DATE.
Quelles bases de données peuvent exécuter le script ?
PostgreSQL, MySQL et MariaDB, SQLite et SQL Server, chacune avec ses propres délimiteurs d’identifiants, son échappement des chaînes, ses valeurs booléennes et sa syntaxe d’upsert. Choisissez la Base de données correspondante avant de télécharger : un script écrit pour l’une ne fonctionne pas tel quel dans les autres.
Peut-il générer des commandes COPY ou LOAD DATA au lieu d’INSERT ?
Non. Le script utilise des instructions standard INSERT, UPSERT, UPDATE ou DELETE. Pour des chargements très volumineux, envisagez l’outil de chargement en masse de votre base, comme COPY dans PostgreSQL ou LOAD DATA dans MySQL, qui lit directement le CSV.