100 % local — seus dados nunca saem do seu navegador

JSON para MySQL — um CREATE TABLE que roda

Transforme uma amostra JSON num CREATE TABLE do MySQL. Os tipos vêm dos valores, e uma string longa demais para VARCHAR(255) recebe TEXT no lugar.

Instantâneo Privado Zero cookies

Entrada JSON

Saída MySQL

O que esta ferramenta faz

Uma amostra JSON vira um 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
);

Os nomes de coluna vão em snake_case e entre crases, então uma palavra reservada ou um hífen numa chave não é problema. Duas chaves que dão o mesmo nome levam sufixo em vez de se fundirem.

Uma coluna do tamanho do valor

As strings viram VARCHAR(255) — salvo quando a amostra mostra que não cabem:

{ "bio": "…301 caracteres…" }
  `bio` TEXT NOT NULL

O MySQL em modo estrito — padrão desde o 5.7 — recusa um valor mais longo que a coluna com o erro 1406. Um VARCHAR(255) aqui teria devolvido uma tabela incapaz de conter o documento que a gerou. Era um defeito real, encontrado ao escrever esta página e corrigido.

O limite vem do valor mais longo da amostra: é um piso, não uma promessa. Se as suas strings de produção forem mais longas que o que você colou, alargue a coluna.

Todas as linhas, não só a primeira

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

A tabela era construída só com o primeiro objeto: a segunda linha da sua própria amostra falhava ao inserir — Unknown column 'b'. Agora as colunas são a união de todos os objetos, e uma chave ausente em alguns é nullable, porque é.

O tipo segue a mesma regra. Uma chave que vale 1 numa linha e "x" na seguinte ficava com o tipo da primeira que aparecesse, e o outro valor não tinha mais coluna onde entrar; agora recebe uma coluna JSON, que segura as duas. Um valor de 300 caracteres que só aparece na décima linha alarga a coluna para TEXT como se estivesse na primeira.

O que não é inventado

  • Nem chave primária, nem índice, nem cláusula de engine ou charset. São decisões sobre os seus dados e o seu servidor; um documento nada diz sobre elas.
  • NOT NULL onde havia valor, NULL para um null e para uma chave ausente em algumas linhas.
  • Objetos e arrays viram colunas JSON. Sem tabela ligada nem chave estrangeira: uma amostra não pode mostrar uma relação, e inventar uma empilharia três palpites.

Privado por padrão

Tudo é executado localmente no seu navegador com JavaScript. Os seus dados nunca são enviados para um servidor, o que torna a ferramenta segura para conteúdo sensível e funciona offline.

Perguntas frequentes

Por que uma das minhas colunas é TEXT e as outras VARCHAR(255)?
Porque aquele valor não cabia. `VARCHAR(255)` é o padrão aqui, e o MySQL em modo estrito recusa um valor mais longo com o erro 1406 — a tabela não conteria a amostra de onde veio. Passando de 255 caracteres, a coluna vira `TEXT`. Se os seus dados reais forem mais longos que a amostra, alargue-a você.
Cadê a chave primária?
Em lugar nenhum: uma amostra não diz qual coluna identifica uma linha. Um `id` que parece único num documento pode se repetir no seguinte. Acrescentar `PRIMARY KEY (id)` — ou um substituto `AUTO_INCREMENT` — é uma linha, e é decisão sobre os seus dados, não leitura deles.
Por que meu objeto aninhado é uma coluna JSON?
Porque o SQL não tem tipos aninhados e uma amostra não mostra relações. `{"address": {"city": "Paris"}}` pode ser uma tabela ligada ou um bloco que pertence à linha; inventar a tabela, a chave estrangeira e o sentido seriam três palpites. O MySQL 5.7 e posteriores guardam como `JSON`, que continua consultável.

Conversores relacionados