Como estruturar dados de CNPJ no MySQL

 Se você está trabalhando com bases públicas de CNPJ em CSV, organizar corretamente no banco de dados é essencial para performance e análise. Abaixo está um exemplo simples de como modelar essas informações no MySQL

 Estrutura das planilhas 

Você normalmente terá 3 arquivos principais:

1. Estabelecimentos
Contém dados detalhados como endereço, CNAE, contatos e situação cadastral.

CNPJ BÁSICO
CNPJ ORDEM
CNPJ DV

IDENTIFICADOR MATRIZ/FILIAL
NOME FANTASIA
SITUAÇÃO CADASTRAL
DATA SITUAÇÃO CADASTRAL
MOTIVO SITUAÇÃO CADASTRAL
NOME DA CIDADE NO EXTERIOR
PAIS
DATA DE INÍCIO ATIVIDADE
CNAE FISCAL PRINCIPAL
CNAE FISCAL SECUNDÁRIA
TIPO DE LOGRADOURO
LOGRADOURO
NÚMERO
COMPLEMENTO
BAIRRO
CEP
UF
MUNICÍPIO

DDD 1
TELEFONE 1
DDD 2
TELEFONE 2
DDD DO FAX
FAX
CORREIO ELETRÔNICO
SITUAÇÃO ESPECIAL
DATA DA SITUAÇÃO ESPECIAL

 2. Empresas
Informações gerais da empresa, como razão social, natureza jurídica e capital.

CNPJ BÁSICO

RAZÃO SOCIAL / NOME EMPRESARIAL

NATUREZA JURÍDICA

QUALIFICAÇÃO DO RESPONSÁVEL

CAPITAL SOCIAL DA EMPRESA

PORTE DA EMPRESA

ENTE FEDERATIVO RESPONSÁVEL

 3. Simples Nacional
Dados sobre enquadramento no Simples e MEI.

 CNPJ BÁSICO

OPÇÃO PELO SIMPLES

DATA DE OPÇÃO PELO SIMPLES

DATA DE EXCLUSÃO DO SIMPLES

OPÇÃO PELO MEI

DATA DE OPÇÃO PELO MEI

DATA DE EXCLUSÃO DO MEI

  Criando a tabela empresas0

CREATE TABLE empresas0 (
  cnpj_basico VARCHAR(8),
  razao_social VARCHAR(255),
  natureza_juridica VARCHAR(4),
  qualificacao_responsavel VARCHAR(2),
  capital_social DECIMAL(15,2),
  porte_empresa VARCHAR(2),
  ente_federativo_responsavel VARCHAR(255)
);

 

Importando dados para TABELAS criadas

tabela: empresas0

Ao fazer o donwnload do arquivo publico empresas (empresas0, empresas1...etc) o arquivo vem com o formato .EMPRECSV.

Colocamos o arquivo no seguinte local: C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\

Utilizamos um script PYTHON para colocar o arquivo no formato .tf8:

arquivo_origem = r"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\K3241.K03200Y0.D60110.EMPRECSV"
arquivo_destino = r"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\K3241.K03200Y0.D60110.EMPRECSV.utf8.csv"

# Tentar abrir como UTF-8
try:
    with open(arquivo_origem, "r", encoding="utf-8") as f:
        conteudo = f.read()
    print("[OK] Arquivo lido como UTF-8")
except UnicodeDecodeError:
    print("[WARN] Erro ao ler como UTF-8. Tentando latin1...")
    with open(arquivo_origem, "r", encoding="latin1") as f:
        conteudo = f.read()
    print("[OK] Arquivo lido como latin1")

# Salvar convertido em UTF-8
with open(arquivo_destino, "w", encoding="utf-8") as f:
    f.write(conteudo)

print(f"[OK] Arquivo convertido salvo em: {arquivo_destino}")

"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\K3241.K03200Y0.D60110.EMPRECSV.utf8.csv"

Por fim, utilizamos um script em PYTHON para dividir o arquivo utf8 em 13 partes para importar para a tabela empresas0

import os

input_file = r"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\K3241.K03200Y0.D60110.EMPRECSV.utf8.csv"
output_dir = r"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\partes"
lines_per_file = 2000000  # 2 milhões de linhas por arquivo

os.makedirs(output_dir, exist_ok=True)

with open(input_file, 'r', encoding='utf-8', errors='ignore') as f:
    header = f.readline()  # lê cabeçalho

    file_count = 0
    line_count = 0
    output_file = None

    for line in f:
        if line_count % lines_per_file == 0:
            if output_file:
                output_file.close()

            output_path = os.path.join(output_dir, f'parte_{file_count}.csv')
            output_file = open(output_path, 'w', encoding='utf-8', newline='')
            output_file.write(header)

            file_count += 1

        output_file.write(line)
        line_count += 1

    if output_file:
        output_file.close()

print(f"Divisão concluída! {file_count} arquivos criados.") 

"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\partes"

Depois importamos as 13 partes para a tabela empresas0 no MySQL:

Antes verificar local infile:

SHOW VARIABLES LIKE 'local_infile';

se necessário use: SET GLOBAL local_infile = 1;


depois podemos utilizar o comando:

LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_0.csv'

INTO TABLE empresas0

FIELDS TERMINATED BY ';'

ENCLOSED BY '"'

LINES TERMINATED BY '\n'

IGNORE 1 ROWS

(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)

SET capital_social = REPLACE(@capital_social, ',', '.');

-- Parte 1

LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_1.csv'

INTO TABLE empresas0

FIELDS TERMINATED BY ';'

ENCLOSED BY '"'

LINES TERMINATED BY '\n'

IGNORE 1 ROWS

(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)

SET capital_social = REPLACE(@capital_social, ',', '.');

-- Parte 2

LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_2.csv'

INTO TABLE empresas0

FIELDS TERMINATED BY ';'

ENCLOSED BY '"'

LINES TERMINATED BY '\n'

IGNORE 1 ROWS

(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)

SET capital_social = REPLACE(@capital_social, ',', '.');

-- Parte 3

LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_3.csv'

INTO TABLE empresas0

FIELDS TERMINATED BY ';'

ENCLOSED BY '"'

LINES TERMINATED BY '\n'

IGNORE 1 ROWS

(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)

SET capital_social = REPLACE(@capital_social, ',', '.');

-- Parte 4

LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_4.csv'

INTO TABLE empresas0

FIELDS TERMINATED BY ';'

ENCLOSED BY '"'

LINES TERMINATED BY '\n'

IGNORE 1 ROWS

(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)

SET capital_social = REPLACE(@capital_social, ',', '.');

-- Parte 5

LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_5.csv'

INTO TABLE empresas0

FIELDS TERMINATED BY ';'

ENCLOSED BY '"'

LINES TERMINATED BY '\n'

IGNORE 1 ROWS

(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)

SET capital_social = REPLACE(@capital_social, ',', '.');

-- Parte 6

LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_6.csv'

INTO TABLE empresas0

FIELDS TERMINATED BY ';'

ENCLOSED BY '"'

LINES TERMINATED BY '\n'

IGNORE 1 ROWS

(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)

SET capital_social = REPLACE(@capital_social, ',', '.');

-- Parte 7

LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_7.csv'

INTO TABLE empresas0

FIELDS TERMINATED BY ';'

ENCLOSED BY '"'

LINES TERMINATED BY '\n'

IGNORE 1 ROWS

(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)

SET capital_social = REPLACE(@capital_social, ',', '.');

-- Parte 8

LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_8.csv'

INTO TABLE empresas0

FIELDS TERMINATED BY ';'

ENCLOSED BY '"'

LINES TERMINATED BY '\n'

IGNORE 1 ROWS

(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)

SET capital_social = REPLACE(@capital_social, ',', '.');

-- Parte 9

LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_9.csv'

INTO TABLE empresas0

FIELDS TERMINATED BY ';'

ENCLOSED BY '"'

LINES TERMINATED BY '\n'

IGNORE 1 ROWS

(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)

SET capital_social = REPLACE(@capital_social, ',', '.');

-- Parte 10

LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_10.csv'

INTO TABLE empresas0

FIELDS TERMINATED BY ';'

ENCLOSED BY '"'

LINES TERMINATED BY '\n'

IGNORE 1 ROWS

(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)

SET capital_social = REPLACE(@capital_social, ',', '.');

-- Parte 11

LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_11.csv'

INTO TABLE empresas0

FIELDS TERMINATED BY ';'

ENCLOSED BY '"'

LINES TERMINATED BY '\n'

IGNORE 1 ROWS

(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)

SET capital_social = REPLACE(@capital_social, ',', '.');

-- Parte 12

LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/partes/parte_12.csv'

INTO TABLE empresas0

FIELDS TERMINATED BY ';'

ENCLOSED BY '"'

LINES TERMINATED BY '\n'

IGNORE 1 ROWS

(cnpj_basico, razao_social, natureza_juridica, qualificacao_responsavel, @capital_social, porte_empresa, ente_federativo_responsavel)

SET capital_social = REPLACE(@capital_social, ',', '.');

depois podemos conferir a quantidade de linhas importadas com o seguinte comando:

SELECT COUNT(*) FROM empresas0;

Criando a tabela estabelecimentos0

CREATE TABLE estabelecimentos0 (
cnpj_basico VARCHAR(8),
cnpj_ordem VARCHAR(4),
cnpj_dv VARCHAR(2),
identificador_matriz_filial VARCHAR(1),
nome_fantasia VARCHAR(255),
situacao_cadastral VARCHAR(2),
data_situacao_cadastral DATE,
motivo_situacao_cadastral VARCHAR(2),
nome_cidade_exterior VARCHAR(255),
pais VARCHAR(3),
data_inicio_atividade DATE,
cnae_fiscal_principal VARCHAR(7),
cnae_fiscal_secundaria TEXT,
tipo_logradouro VARCHAR(50),
logradouro VARCHAR(255),
numero VARCHAR(10),
complemento VARCHAR(255),
bairro VARCHAR(100),
cep VARCHAR(8),
uf VARCHAR(2),
municipio VARCHAR(4),
ddd_1 VARCHAR(4),
telefone_1 VARCHAR(10),
ddd_2 VARCHAR(4),
telefone_2 VARCHAR(10),
ddd_fax VARCHAR(4),
fax VARCHAR(10),
correio_eletronico VARCHAR(255),
situacao_especial VARCHAR(255),
data_situacao_especial DATE
);
 

Utilizamos um script PYTHON para colocar o arquivo no formato .tf8:
 

arquivo_origem = r"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\estabelecimentos\K3241.K03200Y0.D51108.ESTABELE"
arquivo_destino = r"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\estabelecimentos\K3241.K03200Y0.D51108.ESTABELE.utf8.csv"

def converter(encoding):
with open(arquivo_origem, "r", encoding=encoding, errors="strict") as origem, \
open(arquivo_destino, "w", encoding="utf-8") as destino:

for linha in origem:
destino.write(linha)

# tenta UTF-8 primeiro
try:
print("[INFO] Tentando UTF-8...")
converter("utf-8")
print("[OK] Convertido usando UTF-8")
except UnicodeDecodeError:
print("[WARN] UTF-8 falhou. Tentando latin1...")
converter("latin1")
print("[OK] Convertido usando latin1")

Por fim, utilizamos um script em PYTHON para dividir o arquivo utf8 em 13 partes (SE NECESSÁRIO)

import os

input_file = r"C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\estabelecimentos\K3241.K03200Y0.D51108.ESTABELE.utf8.csv"

# cria pasta "partes" dentro da pasta do arquivo
base_dir = os.path.dirname(input_file)
output_dir = os.path.join(base_dir, "partes")

lines_per_file = 2000000 # 2 milhões de linhas por arquivo

os.makedirs(output_dir, exist_ok=True)

with open(input_file, 'r', encoding='utf-8', errors='ignore') as f:
header = f.readline() # lê cabeçalho

file_count = 0
line_count = 0
output_file = None

for line in f:
if line_count % lines_per_file == 0:
if output_file:
output_file.close()

output_path = os.path.join(output_dir, f'parte_{file_count}.csv')
output_file = open(output_path, 'w', encoding='utf-8', newline='')
output_file.write(header)

file_count += 1

output_file.write(line)
line_count += 1

if output_file:
output_file.close()

print(f"Divisão concluída! {file_count} arquivos criados em: {output_dir}")

 

importando para o mysql:


LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/estabelecimentos/partes/parte_0.csv'

INTO TABLE estabelecimentos0

FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

(
cnpj_basico,
cnpj_ordem,
cnpj_dv,
identificador_matriz_filial,
nome_fantasia,
situacao_cadastral,
@data_situacao_cadastral,
motivo_situacao_cadastral,
nome_cidade_exterior,
pais,
@data_inicio_atividade,
cnae_fiscal_principal,
cnae_fiscal_secundaria,
tipo_logradouro,
logradouro,
numero,
complemento,
bairro,
cep,
uf,
municipio,
ddd_1,
telefone_1,
ddd_2,
telefone_2,
ddd_fax,
fax,
correio_eletronico,
situacao_especial,
@data_situacao_especial
)

SET
data_situacao_cadastral = STR_TO_DATE(@data_situacao_cadastral, '%Y%m%d'),
data_inicio_atividade = STR_TO_DATE(@data_inicio_atividade, '%Y%m%d'),
data_situacao_especial = STR_TO_DATE(@data_situacao_especial, '%Y%m%d'); 

 

Comentários