---
title: "Migrer une base MySQL vers SQLite"
description: "Migrez une base MySQL ou MariaDB vers SQLite : convertissez son dump en script avec les mêmes tables, clés et données, et un rapport de chaque changement."
canonical: https://intosql.com/fr/mysql-en-sqlite
last_updated: 2026-10-15
---

# Migrer une base MySQL vers SQLite

Déposez un dump de mysqldump, mariadb-dump, mysqlpump, phpMyAdmin ou Adminer, en .sql ou .sql.gz, et téléchargez un script SQLite avec les mêmes tables, clés, index et données. Chaque valeur que SQLite ne peut pas contenir telle quelle, et chaque objet qu'il ne reprend pas, est listé dans le rapport.

[Guide de migration de MySQL vers SQLite](https://intosql.com/docs/migrations/mysql-to-sqlite)

[Types de données de MySQL vers SQLite](https://intosql.com/docs/types/mysql-to-sqlite)

## Ce qui change de MySQL à SQLite

Chaque ligne est une règle appliquée par le convertisseur, avec la ligne de rapport qu'il écrit quand la règle change quelque chose dans vos données.

| Dans MySQL | Dans SQLite | Ligne du rapport |
| --- | --- | --- |
| TINYINT(1), BOOL | INTEGER avec les valeurs telles quelles |  |
| UNSIGNED integers | INTEGER avec un CHECK qui interdit les négatifs ; BIGINT UNSIGNED avec des valeurs au-delà de 2^63-1 devient TEXT | `unsigned_widened` |
| ZEROFILL and display widths | supprimé | `zerofill_dropped` |
| FLOAT(M,D) | REAL, sans l'échelle | `float_scale_dropped` |
| DECIMAL(p,s) | DECIMAL(p,s) jusqu'à 15 chiffres ; TEXT au-delà | `decimal_as_text` |
| BIT(1), BIT(n) | INTEGER avec la valeur des bits ; BIT(64) en chiffres TEXT |  |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULL | `invalid_date_null` |
| NOT NULL columns with values that become NULL | NOT NULL retiré | `not_null_relaxed` |
| DEFAULT '0000-00-00' | aucune valeur par défaut | `zero_date_default` |
| TIME | texte TIME tel que MySQL l'écrit, durées comprises |  |
| YEAR | INTEGER avec un CHECK de sa plage |  |
| CHAR(n), VARCHAR(n) | VARCHAR(n), non appliqué |  |
| DATETIME | DATETIME en texte ISO 8601 |  |
| TIMESTAMP | TIMESTAMP en texte ISO 8601 en UTC ; le fuseau indiqué par le dump, UTC s'il n'en indique aucun | `timestamp_zone_assumed` |
| ENUM | TEXT avec un CHECK de ses valeurs |  |
| ENUM holding '' (MySQL's error value) | la valeur vide autorisée par le CHECK | `enum_invalid_value` |
| ENUM holding values outside its list | pas de CHECK | `enum_check_skipped` |
| SET | TEXT tel que MySQL l'écrit ('a,b') |  |
| JSON | TEXT |  |
| NUL bytes in text | conservé |  |
| text that isn't valid in its character set | les octets invalides deviennent le caractère de remplacement | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | copié tel quel | `mojibake_suspected` |
| AUTO_INCREMENT | INTEGER PRIMARY KEY AUTOINCREMENT, avec le compteur placé après les identifiants copiés |  |
| AUTO_INCREMENT on part of a key or outside one | INTEGER sans compteur | `identity_without_counter` |
| ON UPDATE CURRENT_TIMESTAMP | un déclencheur AFTER UPDATE | `on_update_trigger` |
| generated columns | GENERATED ALWAYS AS, VIRTUAL ou STORED comme dans la source |  |
| generated columns with functions SQLite lacks | une colonne simple | `generated_not_translated` |
| INVISIBLE columns | colonnes ordinaires | `invisible_column` |
| CHECK constraints | traduites, en ligne dans CREATE TABLE |  |
| CHECK constraints with functions SQLite lacks | non créée | `check_skipped` |
| CHECK ... NOT ENFORCED | non créée | `check_not_enforced` |
| defaults with functions SQLite lacks | aucune valeur par défaut | `default_not_translated` |
| keys and indexes on a prefix, c(20) | un index sur substr(c, 1, 20) | `prefix_unique` |
| FULLTEXT indexes | non créée | `fulltext_not_created` |
| SPATIAL indexes | non créée | `spatial_index_not_created` |
| functional indexes SQLite can't write | non créé | `index_skipped` |
| foreign keys | dans CREATE TABLE, chargées sans vérification, puis listées par PRAGMA foreign_key_check |  |
| foreign keys to columns without a unique key | non créée | `foreign_key_skipped` |
| table, index and column names | tels qu'écrits ; renommés s'ils ne diffèrent que par la casse ou si un nom d'index se répète | `identifier_renamed` |
| GEOMETRY, POINT, POLYGON... | WKB dans un BLOB | `geometry_as_blob` |
| INET4, INET6, UUID (MariaDB) | TEXT |  |
| BINARY, VARBINARY, BLOB | BLOB |  |
| PARTITION BY | une seule table | `partitions_dropped` |
| WITH SYSTEM VERSIONING (MariaDB) | une table avec les lignes actuelles | `system_versioning_dropped` |
| MyISAM, MEMORY and other engines | une table ordinaire | `engine_dropped` |
| dumps of several databases | un seul fichier, chaque table préfixée par le nom de sa base | `databases_merged` |
| views, triggers, procedures, functions and events | listés dans le rapport | `not_converted_objects` |
| dumps without CREATE TABLE | types déduits des valeurs | `no_schema` |
| geometries in a dump without CREATE TABLE | WKB dans un BLOB | `geometry_as_blob` |
| _ci collations | comparaison exacte | `case_insensitive_collation` |
| SET NAMES utf8 from utf8mb4 tables | converti, avec un avertissement | `dump_lost_four_byte_chars` |
| dumps without SET NAMES whose text isn't UTF-8 | lu comme Latin-1 (Windows-1252) | `charset_guessed` |
| sjis, cp932, gbk, big5 dumps | lu comme UTF-8, avec un avertissement | `unsupported_charset` |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | évaluées |  |
| other expressions in rows | NULL | `expression_value` |
| DEFAULT in VALUES | la valeur par défaut de la colonne | `default_keyword_filled` |
| DEFAULT in VALUES without a literal default | NULL | `default_keyword_null` |
| REPLACE and INSERT IGNORE | lignes simples | `replace_as_insert` |
| types IntoSQL doesn't know | TEXT | `unknown_type` |
| values that don't fit their column | NULL | `invalid_value_null` |
| unreadable geometries | NULL | `bad_geometry` |
| CREATE SEQUENCE (MariaDB) | non créée | `sequence_not_converted` |
| VECTOR(n) (MariaDB 11.7+) | TEXT avec les flottants en tableau JSON | `type_replaced` |

## Charger le script dans SQLite

Le script crée les tables, copie les lignes, puis ajoute les clés, les index et les clés étrangères ; il se charge donc vite et s'arrête à la première erreur.

```shell
sqlite3 -bail mydb.sqlite < mysql.sqlite.sql
```

Les clés étrangères sont déclarées dans chaque table et les lignes se chargent sans vérification des clés étrangères. Le script liste ensuite toute ligne qui pointe vers une ligne qui n'existe pas, au lieu d'échouer à mi-chemin.

Pour un gros dump, chargez-le dans un nouveau fichier sur un disque local. Le script charge tout dans une seule transaction sans synchronisation, il va donc à la vitesse du disque, et un chargement interrompu ne laisse aucune table partielle.

La ligne de commande charge le fichier directement dans une base SQLite, sans écrire de script. C'est gratuit.

## Faire le dump MySQL pour un meilleur résultat

Le convertisseur lit ce que contient le dump. Ces options y gardent davantage de vos données :

- --default-character-set=utf8mb4 garde les emoji et autres caractères sur 4 octets, qu'un dump utf8 perd avant que le convertisseur ne le voie.
- --hex-blob écrit les colonnes binaires en hexadécimal, ce qui résiste aux copies entre systèmes.
- --routines --triggers --events ajoutent ces objets au dump, pour que le rapport puisse les lister.

## Ce qui n'est pas converti

Les vues, déclencheurs, procédures stockées, fonctions et événements sont écrits dans le langage propre à chaque base de données. Ils sont listés par nom dans le rapport, jamais supprimés en silence, pour que vous puissiez les réécrire pour SQLite.

## Questions sur MySQL vers SQLite

### Mon dump est-il envoyé ?

Non. Le convertisseur s'exécute dans votre navigateur et lit le dump depuis votre disque par morceaux ; il ne quitte donc jamais votre ordinateur. L'application de bureau et la ligne de commande convertissent aussi sur votre ordinateur.

### Quelle taille peut avoir le dump ?

Le convertisseur ne garde jamais tout le dump en mémoire : il lit le fichier deux fois, par plages, et écrit le script au fur et à mesure. Les dumps de plusieurs gigaoctets se convertissent dans le navigateur, dans l'application de bureau et avec la ligne de commande.

### Lit-il les dumps MariaDB ?

Oui. Les dumps de mariadb-dump et de MariaDB 10.3 à 12 se convertissent de la même façon, y compris les colonnes INET6, INET4 et UUID de MariaDB.

### Que deviennent les dates 0000-00-00 ?

Elles deviennent NULL : SQLite stockerait le texte, mais rien ne lit 0000-00-00 comme une date. Le rapport indique combien il y en avait dans chaque colonne.

### Les valeurs AUTO_INCREMENT sont-elles conservées ?

Oui. Une colonne AUTO_INCREMENT qui forme toute la clé primaire de la table devient INTEGER PRIMARY KEY AUTOINCREMENT, chaque ligne garde son identifiant, et le prochain identifiant reprend après le plus élevé. Toute autre colonne AUTO_INCREMENT garde ses valeurs sans compteur, et le rapport le signale.

### TINYINT(1) devient-il boolean ?

Non. SQLite n'a pas de type booléen, donc TINYINT(1) est un INTEGER et chaque valeur reste telle quelle.

### Et les procédures stockées et les déclencheurs ?

Ils sont listés par nom dans le rapport et ne sont pas convertis, car chaque base de données les écrit dans son propre langage. ON UPDATE CURRENT_TIMESTAMP est l'exception : il devient un déclencheur SQLite.

### Sur quelles versions de SQLite le script se charge-t-il ?

SQLite 3.31 et versions ultérieures. Chaque dump de test se charge sur 3.31 et 3.54, et s'arrête à la première erreur en cas de problème.

## Depuis MySQL

- [MySQL vers PostgreSQL](https://intosql.com/fr/mysql-en-postgresql)
- [MySQL vers MySQL](https://intosql.com/fr/mysql-en-mysql)
- [MySQL vers MariaDB](https://intosql.com/fr/mysql-en-mariadb)
- [MySQL vers SQL Server](https://intosql.com/fr/mysql-en-sql-server)
- [MySQL vers Oracle](https://intosql.com/fr/mysql-en-oracle)

## Vers SQLite

- [MariaDB vers SQLite](https://intosql.com/fr/mariadb-en-sqlite)
- [PostgreSQL vers SQLite](https://intosql.com/fr/postgresql-en-sqlite)
- [SQL Server vers SQLite](https://intosql.com/fr/sql-server-en-sqlite)
- [SQLite vers SQLite](https://intosql.com/fr/sqlite-en-sqlite)
- [Oracle vers SQLite](https://intosql.com/fr/oracle-en-sqlite)

## Guide et toutes les paires

- [SQLite vers MySQL](https://intosql.com/fr/sqlite-en-mysql)
- [Guide de migration de MySQL vers SQLite](https://intosql.com/docs/migrations/mysql-to-sqlite)
- [Types de données de MySQL vers SQLite](https://intosql.com/docs/types/mysql-to-sqlite)
- [Toutes les paires de bases de données](https://intosql.com/fr/migration-de-base-de-donnees)
