Validar CNPJ com MySQL

Validar CNPJ com MySQL

Neste artigo, você vai ver como é possível validar números de CNPJ utilizando o MySQL.

A validação de dados é algo que pode ser feito pelo frontend do seu sistema, mas, é comum ocorrer casos onde se recebe uma base existente onde os dados não foram validados. 

O CNPJ é formado por 14 dígitos numéricos que seguem o formato "##.###.###/####-##". A validação é feita utilizando os 12 primeiros dígitos e através de um cálculo simples, se valida se o resultado corresponde aos dois últimos números.

Caso você queira entender com detalhes qual a lógica utilizada para validar um CNPJ, pode dar uma olhada neste artigo que eu escrevi, lá eu explico como a validação é feita.

Como funciona a lógica de validação do CNPJ?

Vamos criar uma tabela de testes para armazenar nossos CNPJs.

 

CREATE TABLE CNPJ(

id INT NOT NULL AUTO_INCREMENT,

CNPJ VARCHAR(14) NOT NULL,

PRIMARY KEY (id)

);

 

Vamos popular a tabela com números de CNPJ aleatórios. Para isso, vamos utilizar este site:

 

https://www.4devs.com.br/gerador_de_cnpj

 

Gerei 6 números de CNPJ, o primeiro, o terceiro e o quinto são números válidos, os demais tem erros. Em nosso exemplo, os CNPJ estarão armazenados sem pontos ou traços. Vamos inserir estes números em nossa tabela.

 

INSERT INTO CNPJ (CNPJ) VALUES ('57686536000120');

INSERT INTO CNPJ (CNPJ) VALUES ('23459947000162');

INSERT INTO CNPJ (CNPJ) VALUES ('71842960000147');

INSERT INTO CNPJ (CNPJ) VALUES ('56478820000146');

INSERT INTO CNPJ (CNPJ) VALUES ('58361419000159');

INSERT INTO CNPJ (CNPJ) VALUES ('90530135000155');

 

Agora, vamos criar uma função, para poder reaproveitar esta lógica no futuro. Abra uma nova janela de consulta e execute o seguinte código:

 

DELIMITER $

CREATE FUNCTION validar_CNPJ(CNPJ CHAR(14)) RETURNS INT

BEGIN

    DECLARE INDICE INT;

    DECLARE SOMA INT;

    DECLARE DIGITO_1 INT;

    DECLARE DIGITO_2 INT;

    DECLARE VAR1 INT;

    DECLARE VAR2 INT;

    DECLARE DIGITO_1_CNPJ CHAR(1);

    DECLARE DIGITO_2_CNPJ CHAR(1);

    DECLARE NR_DOCUMENTO_AUX VARCHAR(14);

    SET SOMA = 0;

    SET INDICE = 1;

    SET VAR1 = 5;

/* Verificando se o formato é valido */

SET NR_DOCUMENTO_AUX = LTRIM(RTRIM(CNPJ));

    IF (NR_DOCUMENTO_AUX IN ('00000000000000', '11111111111111', '22222222222222', '33333333333333', '44444444444444', '55555555555555', '66666666666666', '77777777777777', '88888888888888', '99999999999999')) THEN

        RETURN 0;

    END IF;

    IF (LENGTH(NR_DOCUMENTO_AUX) <> 14) THEN

        RETURN 0;

    END IF;

/* Iniciando a validacao */

SET DIGITO_1_CNPJ = SUBSTRING(CNPJ, LENGTH(CNPJ)- 1, 1);

    SET DIGITO_2_CNPJ = SUBSTRING(CNPJ, LENGTH(CNPJ), 1);

 

    WHILE (INDICE <= 4 ) DO

        SET SOMA = SOMA + CAST(SUBSTRING(CNPJ, INDICE, 1) AS UNSIGNED) * VAR1;

        SET INDICE = INDICE + 1;

        SET VAR1 = VAR1 - 1;

    END WHILE;

 

       

    SET VAR2 = 9;

    WHILE (INDICE <= 12 ) DO

        SET SOMA = SOMA + CAST(SUBSTRING(CNPJ, INDICE, 1) AS UNSIGNED) * VAR2;

        SET INDICE = INDICE + 1;

        SET VAR2 = VAR2 - 1;

    END WHILE;

 

    SET DIGITO_1 = (SOMA % 11 );

 

/* Primeiro Digito Verificador */

    IF DIGITO_1 < 2 THEN

        SET DIGITO_1 = 0;

    ELSE

        SET DIGITO_1 = 11 - (SOMA % 11);

END IF;

 

 

    SET INDICE = 1;

    SET SOMA = 0;

    SET VAR1 = 6;

    

 

    WHILE (INDICE <= 5 ) DO

        SET SOMA = SOMA + CAST(SUBSTRING(CNPJ, INDICE, 1) AS UNSIGNED) * VAR1;

        SET INDICE = INDICE + 1;

        SET VAR1 = VAR1 - 1;

    END WHILE;

 

    SET VAR2 = 9;

    WHILE (INDICE <= 13 ) DO

        SET SOMA = SOMA + CAST(SUBSTRING(CNPJ, INDICE, 1) AS UNSIGNED) * VAR2;

        SET INDICE = INDICE + 1;

        SET VAR2 = VAR2 - 1;       

    END WHILE;

 

 

    SET DIGITO_2 = (SOMA % 11);

  /* Segundo Digito Verificador */

    IF DIGITO_2 < 2 THEN

        SET DIGITO_2 = 0;

    ELSE

        SET DIGITO_2 = 11 - (SOMA % 11 );

END IF;

 

 

/* Validando os digitos verificadores calculados com os digitos verificadores do CNPJ informado */

    IF (DIGITO_1 = DIGITO_1_CNPJ) AND (DIGITO_2 = DIGITO_2_CNPJ) THEN

        RETURN 1;

    ELSE

        RETURN 0;

END IF;

END;

$

 

Agora vamos testar a nossa função, para fazer isso, faremos a seguinte consulta:

 

SELECT CNPJ, validar_CNPJ(CNPJ) as resultado FROM CNPJ

 

Perceba que na coluna resultado foi retornado 1 para os CNPJs válidos e 0 para os inválidos. Se você quiser ver somente os válidos, poderia fazer a consulta desta forma:

 

select CNPJ from CNPJ where validar_CNPJ(CNPJ) = 1

 

 

Outros conteudos que podem ser de seu interesse

Como localizar datas consecutivas com SQL
18/02/2024SQL

Como localizar datas consecutivas com SQL

Confira como localizar datas consecutivas utilizando SQL

Saiba mais...
Retornando dados do registro anterior ou seguinte com SQL
12/02/2023SQL

Retornando dados do registro anterior ou seguinte com SQL

Veja como trabalhar com as funções LAG e LEAD para retornar dados do registro anterior ou seguinte

Saiba mais...

Conteúdo sobre banco de dados sem complicação!