Validar CPF com MySQL

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

Validar CPF com SQL Server

 

 

Outros conteudos que podem ser de seu interesse

SQL vs DAX - Trabalhando com strings
19/12/2021SQL

SQL vs DAX - Trabalhando com strings

Um comparativo de como trabalhar com strings no SQL e no DAX

Saiba mais...
SQL vs Pandas - Operações Básicas parte 2
12/11/2023SQL

SQL vs Pandas - Operações Básicas parte 2

Neste segundo artigo você vai ver uma comparação de como pesquisar dados e unir resultados no SQL e no Pandas

Saiba mais...

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