100 % local — vos données ne quittent jamais votre navigateur

JSON en MySQL — un CREATE TABLE exécutable

Transformez un échantillon JSON en CREATE TABLE MySQL. Les types viennent des valeurs, et une chaîne trop longue pour VARCHAR(255) reçoit TEXT à la place.

Instantané Privé Zéro cookie

Entrée JSON

Sortie MySQL

Ce que fait cet outil

Un échantillon JSON devient un CREATE TABLE.

{ "id": 1, "firstName": "Ada", "score": 9.5, "address": { "city": "Paris" } }
CREATE TABLE `root` (
  `id` BIGINT NOT NULL,
  `first_name` VARCHAR(255) NOT NULL,
  `score` DOUBLE NOT NULL,
  `address` JSON NOT NULL
);

Les noms de colonnes sont en snake_case entre accents graves : un mot réservé ou un tiret dans une clé ne pose donc pas de problème. Deux clés qui donnent le même nom sont suffixées plutôt que fondues.

Une colonne à la taille de la valeur

Les chaînes deviennent VARCHAR(255) — sauf quand l’échantillon montre qu’elles n’y tiennent pas :

{ "bio": "…301 caractères…" }
  `bio` TEXT NOT NULL

MySQL en mode strict — le défaut depuis 5.7 — refuse une valeur plus longue que la colonne avec l’erreur 1406. Un VARCHAR(255) ici vous aurait rendu une table incapable de contenir le document qui l’a engendrée. C’était un vrai défaut, trouvé en écrivant cette page puis corrigé.

La borne vient de la plus longue valeur de l’échantillon : c’est un plancher, pas une promesse. Si vos chaînes de production sont plus longues que ce que vous avez collé, élargissez la colonne.

Toutes les lignes, pas seulement la première

[{ "a": 1 }, { "a": 2, "b": "x" }]
CREATE TABLE `root_item` (
  `a` BIGINT NOT NULL,
  `b` VARCHAR(255) NULL
);

La table était bâtie sur le seul premier objet : la deuxième ligne de votre propre échantillon échouait donc à l’insertion — Unknown column 'b'. Les colonnes sont maintenant l’union de tous les objets, et une clé absente de certains est nullable, parce qu’elle l’est.

Le type suit la même règle. Une clé qui vaut 1 sur une ligne et "x" sur la suivante prenait le type de la première rencontrée, et l’autre valeur n’avait plus de colonne où aller ; elle reçoit maintenant une colonne JSON, qui tient les deux. Une valeur de 300 caractères qui n’apparaît qu’à la dixième ligne élargit la colonne en TEXT comme si elle avait été la première.

Ce qui n’est pas inventé

  • Ni clé primaire, ni index, ni clause de moteur ou de jeu de caractères. Ce sont des décisions sur vos données et votre serveur ; un document n’en dit rien.
  • NOT NULL partout où une valeur était présente, NULL pour un null et pour une clé absente de certaines lignes.
  • Les objets et les tableaux deviennent des colonnes JSON. Pas de table liée, pas de clé étrangère : un échantillon ne peut pas montrer une relation, et en inventer une empilerait trois suppositions.

Confidentiel par conception

Tout s’exécute localement dans votre navigateur en JavaScript. Vos données ne sont jamais envoyées sur un serveur, ce qui rend l’outil sûr pour des contenus sensibles, et il fonctionne hors ligne.

Questions fréquentes

Pourquoi une de mes colonnes est-elle TEXT et les autres VARCHAR(255) ?
Parce que cette valeur n’y tenait pas. `VARCHAR(255)` est le défaut ici, et MySQL en mode strict refuse une valeur plus longue avec l’erreur 1406 — la table ne contiendrait pas l’échantillon dont elle vient. Au-delà de 255 caractères, la colonne devient `TEXT`. Si vos données réelles sont plus longues que l’échantillon, élargissez-la.
Où est la clé primaire ?
Nulle part : un échantillon ne dit pas quelle colonne identifie une ligne. Un `id` qui semble unique dans un document peut se répéter dans le suivant. Ajouter `PRIMARY KEY (id)` — ou un substitut `AUTO_INCREMENT` — fait une ligne, et c’est une décision sur vos données, pas une lecture.
Pourquoi mon objet imbriqué est-il une colonne JSON ?
Parce que SQL n’a pas de types imbriqués et qu’un échantillon ne montre aucune relation. `{"address": {"city": "Paris"}}` peut être une table jointe ou un bloc qui appartient à la ligne ; inventer la table, la clé étrangère et le sens ferait trois suppositions. MySQL 5.7 et suivants le stockent en `JSON`, qui reste interrogeable.

Convertisseurs associés