Validar CPF com MySQL
Neste artigo, você vai ver como é possível validar números de CPF utilizando o MySQL.
A validação de dados é algo que deve 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 CPF é formado por 11 dígitos numéricos que seguem o formato "###.###.###-##". A validação é feita utilizando os 9 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 CPF, 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 CPF?
Vamos criar uma tabela de testes para armazenar nossos CPFs.
CREATE TABLE CPF(
id INT NOT NULL AUTO_INCREMENT,
CPF VARCHAR(11) NOT NULL,
PRIMARY KEY (id)
);
Vamos popular a tabela com números de CPFs aleatórios. Para isso, vamos utilizar este site:
https://www.4devs.com.br/gerador_de_cpf
Gerei 3 números de CPF, o primeiro, o terceiro e o quinto são números válidos, os demais tem erros. Em nosso exemplo, os CPFs estarão armazenados sem pontos ou traços. Vamos inserir estes números em nossa tabela.
INSERT INTO CPF (CPF) VALUES ('75392083099');
INSERT INTO CPF (CPF) VALUES ('75392081099');
INSERT INTO CPF (CPF) VALUES ('31804409022');
INSERT INTO CPF (CPF) VALUES ('31804409021');
INSERT INTO CPF (CPF) VALUES ('17387354006');
INSERT INTO CPF (CPF) VALUES ('27387354006');
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_CPF(CPF CHAR(11)) RETURNS INT
BEGIN
DECLARE SOMA INT;
DECLARE INDICE INT;
DECLARE DIGITO_1 INT;
DECLARE DIGITO_2 INT;
DECLARE NR_DOCUMENTO_AUX VARCHAR(11);
DECLARE DIGITO_1_CPF CHAR(2);
DECLARE DIGITO_2_CPF CHAR(2);
/*
Remove os CPFs onde todos os números são iguais
*/
SET NR_DOCUMENTO_AUX = LTRIM(RTRIM(CPF));
IF (NR_DOCUMENTO_AUX IN ('00000000000', '11111111111', '22222222222', '33333333333', '44444444444', '55555555555', '66666666666', '77777777777', '88888888888', '99999999999', '12345678909')) THEN
RETURN 0;
END IF;
/*
O CPF deve ter 11 caracteres
*/
IF (LENGTH(NR_DOCUMENTO_AUX) <> 11) THEN
RETURN 0;
ELSE
/*
Armazendo os digitos verificadores do CPF informado
*/
SET DIGITO_1_CPF = SUBSTRING(NR_DOCUMENTO_AUX,LENGTH(NR_DOCUMENTO_AUX)-1,1);
SET DIGITO_2_CPF = SUBSTRING(NR_DOCUMENTO_AUX,LENGTH(NR_DOCUMENTO_AUX),1);
/*Cálculo do primeiro dígito verificador*/
SET SOMA = 0;
SET INDICE = 1;
WHILE (INDICE <= 9) DO
SET Soma = Soma + CAST(SUBSTRING(NR_DOCUMENTO_AUX,INDICE,1) AS UNSIGNED) * (11 - INDICE);
SET INDICE = INDICE + 1;
END WHILE;
SET DIGITO_1 = 11 - (SOMA % 11);
IF (DIGITO_1 > 9) THEN
SET DIGITO_1 = 0;
END IF;
/* Cálculo do segundo dígito verificador */
SET SOMA = 0;
SET INDICE = 1;
WHILE (INDICE <= 10) DO
SET Soma = Soma + CAST(SUBSTRING(NR_DOCUMENTO_AUX,INDICE,1) AS UNSIGNED) * (12 - INDICE);
SET INDICE = INDICE + 1;
END WHILE;
SET DIGITO_2 = 11 - (SOMA % 11);
IF DIGITO_2 > 9 THEN
SET DIGITO_2 = 0;
END IF;
/* Validando os digitos verificadores calculados com os digitos verificadores do CPF informado */
IF (DIGITO_1 = DIGITO_1_CPF) AND (DIGITO_2 = DIGITO_2_CPF) THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END IF;
END;
$
Agora vamos testar a nossa função, para fazer isso, faremos a seguinte consulta:
SELECT CPF, validar_CPF(CPF) as resultado FROM CPF
Perceba que na coluna resultado foi retornado 1 para os CPFs válidos e 0 para os inválidos. Se você quiser ver somente os válidos, poderia fazer a consulta desta forma:
select CPF from CPF where validar_CPF(CPF) = 1
Se você deseja aprender como fazer a validação do CPF utilizando o SQL Server, consulte o link a seguir