BUG MySQL: Arredondamento de Inteiros, Decimais e md5

Essa é fera… Passei uma raiva esses dias preparando uma string de segurança.

Dentre as que temos, usei md5 como criptografia, mas algo acontecia que não entendia… O que que acontecia que no retorno da criptografia dava erro… BUG no MySQL!

Vamos por etapas…

Regras da Matemática:

  1. Número 0 (zero) à esquerda de inteiros, são ignorados
    Exemplo: 010 = 10; 000002 = 2.

  2. Número 0 (zero) à direita em decimais de números, são ignorados
    Exemplo: 10,01000 = 10,01; 15,154000000=15,154

Ok… Partindo deste princípio básico (isso agente aprende na antiga 1ª série), podemos afirmar que se eu executar o SQL citado, teremos todos os md5s iguais.

SELECT md5(010), md5(10), md5(10.0), md5(10.00)

Lembre-se que afirmamos que tudo isso equivale a 10, conforme regras da matemática.

Resposta:

'd3d9446802a44259755d38e6d163e820', 'd3d9446802a44259755d38e6d163e820', '43a1437f7f656cd8be7c996c58719e0a', '8496df76fc160c03f8e95b61719903b0'

Opa… 010 e 10 seguem as regras, mas 10.0 e 10.00 não. As regras para decimais não são seguidas no MySQL. Para ele, 10.0 e 10.00 são diferentes. Jesus!

Vamos à prática. Se por um acaso você usar uma decimal no seu MySQL que contenha o valor, por exemplo, 10.00 e necessite converter isso em md5, você tem um problema, e se estiver usando, por exemplo, o PHP como linguagem de programação, o problema fica gigante… Porquê? Porque o PHP segue as regras!

Em PHP:

echo md5(010).' - '.md5(10).' - '.md5(10.0).' - '.md5(10.00);

Retorna:

d3d9446802a44259755d38e6d163e820 - d3d9446802a44259755d38e6d163e820 - d3d9446802a44259755d38e6d163e820 - d3d9446802a44259755d38e6d163e820

Daí as coisas não batem… PHP=d3d9446802a44259755d38e6d163e820 e MySQL=8496df76fc160c03f8e95b61719903b0

ERRO!!!

Jesus tenha misericórdia de nós!

Vamos fazer um “arranjo técnico”, inspiração divina…

select md5(10),md5(10.00),md5(10+.00);

'd3d9446802a44259755d38e6d163e820', '8496df76fc160c03f8e95b61719903b0', '8496df76fc160c03f8e95b61719903b0'

Opa… 10+.00 deu certo… então…

Pegue o valor e some com .00, ou o número de casas decimais que precisa… Voilà… Tá feito…