Página 1 de 1
Resultado diferente Hb_Md5 x Md5 (Mysql)
Enviado: 09 Mar 2017 22:09
por janio
Pq a diferença? Ou como fazer pra serem iguais?
Harbour
Select Produto
DbSetOrder(1)
DbGoTop()
CodMd5 = Hb_Md5( Str(CODIGO) + CODBAR + DESCRI )
Resultado = 3e3d66713b697f0c1dafbe4f87017eeb
MySql
SELECT MD5(CODIGO + CODBAR + DESCRI) from a03prd where codigo=1
Resultado = 732413127680b53a739bf0c561d63afa
Resultado diferente Hb_Md5 x Md5 (Mysql)
Enviado: 09 Mar 2017 22:23
por fladimir
Sem analisar muito a fundo, pra retornar o mesmo código MD5 os conteúdios passados para função tem q ser idênticos, ou seja... vamos analisar um trecho do código...
Harbour
//----------------> Aki subentendemos q por estar setado dbSetOrder(1) e depois dbGoTop() seja o índice q em ordem de código e estamos no código 1 tb... // agora vc conferiu se na tabela é este o primeiro registro deste índice?
CodMd5 = Hb_Md5( Str(CODIGO) ) //--> Outro detalhe, q considero onde possívelmente esteja a diferença, observe q vc transformou o campo numérico para Caracter e isso faz com q sejam adicionados espaços, q serão considerados na função do MD5
MySql
SELECT MD5(CODIGO) from a03prd where codigo=1 //--> Aki vc esta definindo q as informações são referentes ao código 1... ok, agora qual o tipo do campo Codigo aki? Caracter?
Então voltando ao início, vc tem q ter certeza q o contéudo passado para as funções q geram o MD5 são exatamente identicos...
Resultado diferente Hb_Md5 x Md5 (Mysql)
Enviado: 09 Mar 2017 22:46
por janio
Fladimir,
A diferença parece estar mesmo na transformação de campo NUMERICO em CARACTERE.
hb_md5( AllTrim(Str(CODIGO)) )
deu o mesmo resultado de
SELECT MD5(CODIGO)
Resultado diferente Hb_Md5 x Md5 (Mysql)
Enviado: 09 Mar 2017 22:48
por janio
O campo codigo eh NUMERO sem casas decimais. Funcionou!
Agora estou vendo como fazer para campos que tenham casas decimais. A principio nao funcionou apenas tirando todos os espaços com AllTrim
Janio
Resultado diferente Hb_Md5 x Md5 (Mysql)
Enviado: 09 Mar 2017 23:10
por janio
O negocio tá meio maluco!
SELECT MD5( '1' )
e
SELECT MD5( '1' + 'Janio' )
tem o mesmo resultado = c4ca4238a0b923820dcc509a6f75849b
Resultado diferente Hb_Md5 x Md5 (Mysql)
Enviado: 09 Mar 2017 23:34
por janio
Tem que usar a função CONCAT para juntar os valores
SELECT MD5( CONCAT('1' , 'Janio') )
Avançando...
Campo numerico com CASAS DECIMAIS ainda nao estou conseguindo o mesmo resultado harbour x MySql
Resultado diferente Hb_Md5 x Md5 (Mysql)
Enviado: 10 Mar 2017 07:50
por fladimir
Tem uma função no MySQL q converte tipos, da uma pesquisada, acho q é CAST ou algo assim
Resultado diferente Hb_Md5 x Md5 (Mysql)
Enviado: 10 Mar 2017 12:52
por JoséQuintas
É sempre bom definir a quantidade de casas no StrZero() ou Str() pra não ter surpresas.
Acho que o MySql tem uma funcão Format(), para formatar números, dê uma pesquisada nisso também.
Nota sobre a soma do MySQL: ele pode retirar espaços em branco extras na soma, por isso o resultado não é o esperado. CONCAT() apenas "concatena" as strings, sem alterar o conteúdo.
Resultado diferente Hb_Md5 x Md5 (Mysql)
Enviado: 10 Mar 2017 20:52
por janio
Ola todos,
Consegui no MySql o mesmo resultado do Harbour.
No harbour a gente "junta" valores com "+". No MySql é o CONCAT que faz isso. Essa é a primeira observação.
O outro detalhe é que tive que usar a função Trim no MySql. Campos caracteres vazios o MySql entende como " ", ou seja, com 1 espaço.
Código: Selecionar todos
MD5( Concat( '&SenhaMD5', Trim(PCTALQ), codigo, Trim(codbar), Trim(descri), sldstk, stkdia, Trim(codalq), prcmer)
Código: Selecionar todos
hb_md5( SenhaMD5 + AllTrim(pctalq) + AllTrim(str(codigo)) + AllTrim(CodBar) + AllTrim(Descri) + AllTrim(str(SldStk)) + AllTrim(str(StkDia)) + AllTrim(CodAlq) + AllTrim(str(PrcMer)) )
Janio
Resultado diferente Hb_Md5 x Md5 (Mysql)
Enviado: 10 Mar 2017 21:10
por fladimir
Parabéns!!!
Obrigado por compartilhar.
Resultado diferente Hb_Md5 x Md5 (Mysql)
Enviado: 10 Mar 2017 21:31
por janio
Isso aí Fladimir!
Uso RDD Mediator que se propoe a fazer o mesmo que o SQLRdd do xHarbour. Mediator funciona que é uma maravilha e mim 'salvou' do dbf com pouquíssimas mudanças no código fonte.
No entanto, apesar de ser uma mão na roda esse tipo de rdd, em algumas situações vamos vendo que devemos abandonar o codigo xbase e usar direto os comandos sql.
Exemplo:
Codigo xBase em MySql: 30 mil produtos, 7 minutos para processamento
Código: Selecionar todos
Select Produto
DbSetOrder(1)
DbGoTop()
Do While !Eof()
Trava()
replace STKDIA with SLDSTK
replace MD5REG with RegMd5Produtos()
DbSkip()
Enddo
Codigo MySql: 30 mil produtos, 7 segundos
Código: Selecionar todos
cQuery := [UPDATE a03prd SET STKDIA=SLDSTK, MD5REG=MD5( Concat( '&SenhaMD5', Trim(PCTALQ), codigo, Trim(codbar), Trim(descri), sldstk, stkdia, Trim(codalq), prcmer) ) ]
MedExecSql(cQuery)
Resultado diferente Hb_Md5 x Md5 (Mysql)
Enviado: 13 Mar 2017 08:44
por alxsts
Olá!
Para evitar problemas, não se esqueça de tratar os campos que retornam do banco de dados como valor NULL. Use a função IFNULL() do MySQL em seus SELECTs.