Validar CPF/CNPJ no MySQL

Muito comum nos cadastros de clientes, fornecedores, transportadoras ou seja lá o que for, é colocar em um mesmo campo o CPF ou o CNPJ que estamos cadastrando. Como tudo na vida tem o lado bom e o ruim, aqui não vai ser diferente. Um do problemas, é saber se aquele cadastro é de pessoa física ou jurídica. Mas pra que eu quero saber isso? Como diz a propaganda de uma operadora, não são as respostas que fazem o mundo girar, mas sim as perguntas. 

Como o MySQL não faz isso de uma forma automática, poderemos ter isso via programação do sistema pois tem inúmeras funções para detectar isso seja em PHP, ASP, JAVA ou qualquer que seja a linguagem. Mas hoje essa resposta virá via banco de dados. Então, vamos a ela.

Para isso, basta criarmos uma função. Neste caso vou dar o nome de validarCpf.

CREATE FUNCTION `validarCpf`(CPF CHAR(14)) RETURNS double
BEGIN
    DECLARE INDICE INT;
    DECLARE SOMA INT;
    DECLARE DIG1 INT;
    DECLARE DIG2 INT;
    DECLARE CPF_TEMP VARCHAR(11);
    DECLARE DIGITOS_IGUAIS CHAR(1);
    DECLARE RESULTADO CHAR(1);
    SET RESULTADO = FALSE;
    /*
    Verificando se os dígitos são iguais
    */
    SET CPF_TEMP = SUBSTRING(CPF,1,1);
    SET INDICE = 1;
    SET DIGITOS_IGUAIS = ‘S’;
  IF (LENGTH(CPF)>11) THEN
    SET DIGITOS_IGUAIS = ‘S’;
  ELSE
    SET DIG1=LENGTH(CPF);
    WHILE (DIG1<=12) DO
      SET CPF=CONCAT(“0”,CPF);
      SET DIG1=DIG1+1;
    END WHILE;
    SET CPF=RIGHT(CPF,11);
      WHILE (INDICE <= 11) DO
          IF (SUBSTRING(CPF,INDICE,1) <> CPF_TEMP) Then
              SET DIGITOS_IGUAIS = ‘N’;
          END IF;
          SET INDICE = INDICE + 1;
      END WHILE;
  END IF;
    /*Caso os dígitos não sejam todos iguais Começo o calculo do dígitos*/
    IF (DIGITOS_IGUAIS = ‘N’) THEN
        /*Cálculo do 1º dígito*/
        SET SOMA = 0;
        SET INDICE = 1;
        WHILE (INDICE <= 9) DO         
            SET Soma = Soma + CAST(SUBSTRING(CPF,INDICE,1) AS UNSIGNED) * (11 – INDICE);             SET INDICE = INDICE + 1;     
         END WHILE;     
         SET DIG1 = 11 – (SOMA % 11);     
         IF (DIG1 > 9) THEN
            SET DIG1 = 0;
         END IF;
        — Cálculo do 2º dígito }
        SET SOMA = 0;
        SET INDICE = 1;
        WHILE (INDICE <= 10) DO
             SET Soma = Soma + CAST(SUBSTRING(CPF,INDICE,1) AS UNSIGNED) * (12 – INDICE);              SET INDICE = INDICE + 1;
        END WHILE;
        SET DIG2 = 11 – (SOMA % 11);
        IF DIG2 > 9 THEN
            SET DIG2 = 0;
        END IF;
        — Validando
        IF (DIG1 = SUBSTRING(CPF,LENGTH(CPF)-1,1)) AND (DIG2 = SUBSTRING(CPF,LENGTH(CPF),1)) THEN
            SET RESULTADO = TRUE;
        ELSE
            SET RESULTADO = FALSE;
        END IF;
    END IF;
    RETURN RESULTADO;
END

Problema resolvido.