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