Converter hexadecimal para decimal no MySql

MySQL

Delphi

PhpMyAdmin

12/06/2023

Pessoal alguém sabe como converter hexadecimal para decimal na tabela?
Exemplo tenho uma tabela com os campos identificação e identificação_hex, gostaria que quando o campo identificação_hex fosse preenchido,com o número hexadecimal, automaticamente o campo identificação recebesse o valor já convertido em décimal,alguém sabe como ?
Uso o Xampp phpmyadimin.
Alan

Alan

Curtidas 0

Melhor post

Arthur Heinrich

Arthur Heinrich

12/06/2023

Você precisa de duas coisas:

1 - Saber converter valores em hexadecimal para decimal
2 - Automatizar esta ação, sempre que uma coluna sofre alteração

No MySQL, você pode converter um valor hexadecimal para decimal utilizando a função CONV(): Ex.: conv('FF',16,10) converte o FF da base 16 (hexadecimal) para a base 10, resultando 255.

Para automatizar a atualização de uma coluna em função da alteração de outra, isto é feito via trigger.

mysql> delimiter //
mysql> CREATE TRIGGER upd_identificacao BEFORE UPDATE ON account
       FOR EACH ROW
       BEGIN
           SET NEW.identificacao = conv(OLD.identificacao_hex,16,10);
       END;//
mysql> delimiter ;

GOSTEI 1

Mais Respostas

Alan

Alan

12/06/2023

Você precisa de duas coisas:

1 - Saber converter valores em hexadecimal para decimal
2 - Automatizar esta ação, sempre que uma coluna sofre alteração

No MySQL, você pode converter um valor hexadecimal para decimal utilizando a função CONV(): Ex.: conv('FF',16,10) converte o FF da base 16 (hexadecimal) para a base 10, resultando 255.

Para automatizar a atualização de uma coluna em função da alteração de outra, isto é feito via trigger.

mysql> delimiter //
mysql> CREATE TRIGGER upd_identificacao BEFORE UPDATE ON account
       FOR EACH ROW
       BEGIN
           SET NEW.identificacao = conv(OLD.identificacao_hex,16,10);
       END;//
mysql> delimiter ;



Obrigado Arthur Heinrich.
Deu quase certo aqui,tive só que alterar o
SET NEW.identificacao = conv(OLD.identificacao_hex,16,10);
para SET NEW.identificacao = conv(new.identificacao_hex,16,10);
Se salvo na tabela no campo identificacao_hex ele converte do hexa para o decimal no campo identificacao,
porem agora se vou salvar direto qualquer registro no campo identificacao ele da a menssagem ''Column identificacao cannot be null'. detalhe não esta nulo.
Sera que teria uma forma de colocar uma condição If , tipo se o campo identificacao_hex receber algum registro entao ele faz a conversao para o campo identificacao caso ao contrario identificacao recebe o registro que esta no StringGrid mesmo?
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

12/06/2023

Você precisa de duas coisas:

1 - Saber converter valores em hexadecimal para decimal
2 - Automatizar esta ação, sempre que uma coluna sofre alteração

No MySQL, você pode converter um valor hexadecimal para decimal utilizando a função CONV(): Ex.: conv(''FF'',16,10) converte o FF da base 16 (hexadecimal) para a base 10, resultando 255.

Para automatizar a atualização de uma coluna em função da alteração de outra, isto é feito via trigger.

mysql> delimiter //
mysql> CREATE TRIGGER upd_identificacao BEFORE UPDATE ON account
       FOR EACH ROW
       BEGIN
           SET NEW.identificacao = conv(OLD.identificacao_hex,16,10);
       END;//
mysql> delimiter ;



Obrigado Arthur Heinrich.
Deu quase certo aqui,tive só que alterar o
SET NEW.identificacao = conv(OLD.identificacao_hex,16,10);
para SET NEW.identificacao = conv(new.identificacao_hex,16,10);
Se salvo na tabela no campo identificacao_hex ele converte do hexa para o decimal no campo identificacao,
porem agora se vou salvar direto qualquer registro no campo identificacao ele da a menssagem ''''Column identificacao cannot be null''. detalhe não esta nulo.
Sera que teria uma forma de colocar uma condição If , tipo se o campo identificacao_hex receber algum registro entao ele faz a conversao para o campo identificacao caso ao contrario identificacao recebe o registro que esta no StringGrid mesmo?


Desculpe pelo OLD. e o nome da tabela, que eu não ajustei corretamente.

A trigger acima é de update. Se voce faz um update com identificacao_hex nulo, a trigger vai tentar atualizar a coluna identificacao com null também. Voce pode utilizar um if para evitar isso.

No momento do insert, esta trigger não é executada. Alguns bancos aceitam criar triggers com múltiplos eventos (insert or update). Não sei se é o caso do MySQL. Mas voce pode criar outra trigger, para tratar o insert tembém.

A sua dúvida vem antes da trigger, ja que a trigger roda no banco, não é possível acessar o seu grid.

Então, a lógica precisa estar na aplicação.

As trigguers podem fazer o caminho de mão dupla, desde que, pelo menos uma das colunas seja preenchida, preenchendo automaticamente a que estiver nula, com base no valor da outra.

A questão é, o que fazer quando ambas as colunas são informadas, mas estão inconsistentes.

Por exemplo, se voce insere o valor 10, ''F'', que está errado.

Então, a lógica deve considerar uma destas colunas como sendo prioritária.

Supondo que a coluna identificacao seja a PK e seja considerada a principal. Se ambas forem preenchidas, podendo haver diferença entre os valores, voce deve corrigir o valor da coluna identificacao_hex. Mas, como não da para saber se está errado até comparar, então, pode sempre atribuir.

Ficaria mais ou menos assim:

  if (NEW.identificacao is not null) then
    NEW.identificacao_hex = hex(NEW.identificacao)
  else
    NEW.identificacao = conv(NEW.identificacao_hex, 16, 10);
GOSTEI 1
Alan

Alan

12/06/2023

Você precisa de duas coisas:

1 - Saber converter valores em hexadecimal para decimal
2 - Automatizar esta ação, sempre que uma coluna sofre alteração

No MySQL, você pode converter um valor hexadecimal para decimal utilizando a função CONV(): Ex.: conv(''FF'',16,10) converte o FF da base 16 (hexadecimal) para a base 10, resultando 255.

Para automatizar a atualização de uma coluna em função da alteração de outra, isto é feito via trigger.

mysql> delimiter //
mysql> CREATE TRIGGER upd_identificacao BEFORE UPDATE ON account
       FOR EACH ROW
       BEGIN
           SET NEW.identificacao = conv(OLD.identificacao_hex,16,10);
       END;//
mysql> delimiter ;



Obrigado Arthur Heinrich.
Deu quase certo aqui,tive só que alterar o
SET NEW.identificacao = conv(OLD.identificacao_hex,16,10);
para SET NEW.identificacao = conv(new.identificacao_hex,16,10);
Se salvo na tabela no campo identificacao_hex ele converte do hexa para o decimal no campo identificacao,
porem agora se vou salvar direto qualquer registro no campo identificacao ele da a menssagem ''''Column identificacao cannot be null''. detalhe não esta nulo.
Sera que teria uma forma de colocar uma condição If , tipo se o campo identificacao_hex receber algum registro entao ele faz a conversao para o campo identificacao caso ao contrario identificacao recebe o registro que esta no StringGrid mesmo?


Desculpe pelo OLD. e o nome da tabela, que eu não ajustei corretamente.

A trigger acima é de update. Se voce faz um update com identificacao_hex nulo, a trigger vai tentar atualizar a coluna identificacao com null também. Voce pode utilizar um if para evitar isso.

No momento do insert, esta trigger não é executada. Alguns bancos aceitam criar triggers com múltiplos eventos (insert or update). Não sei se é o caso do MySQL. Mas voce pode criar outra trigger, para tratar o insert tembém.

A sua dúvida vem antes da trigger, ja que a trigger roda no banco, não é possível acessar o seu grid.

Então, a lógica precisa estar na aplicação.

As trigguers podem fazer o caminho de mão dupla, desde que, pelo menos uma das colunas seja preenchida, preenchendo automaticamente a que estiver nula, com base no valor da outra.

A questão é, o que fazer quando ambas as colunas são informadas, mas estão inconsistentes.

Por exemplo, se voce insere o valor 10, ''F'', que está errado.

Então, a lógica deve considerar uma destas colunas como sendo prioritária.

Supondo que a coluna identificacao seja a PK e seja considerada a principal. Se ambas forem preenchidas, podendo haver diferença entre os valores, voce deve corrigir o valor da coluna identificacao_hex. Mas, como não da para saber se está errado até comparar, então, pode sempre atribuir.

Ficaria mais ou menos assim:

  if (NEW.identificacao is not null) then
    NEW.identificacao_hex = hex(NEW.identificacao)
  else
    NEW.identificacao = conv(NEW.identificacao_hex, 16, 10);


esta apresentando esse erro

Erro SQL (1064): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '.identificacao_hex = hex(NEW.identificacao)
else
NEW.identificacao = conv...' at line 3 */
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

12/06/2023


Desculpe pelo OLD. e o nome da tabela, que eu não ajustei corretamente.

A trigger acima é de update. Se voce faz um update com identificacao_hex nulo, a trigger vai tentar atualizar a coluna identificacao com null também. Voce pode utilizar um if para evitar isso.

No momento do insert, esta trigger não é executada. Alguns bancos aceitam criar triggers com múltiplos eventos (insert or update). Não sei se é o caso do MySQL. Mas voce pode criar outra trigger, para tratar o insert tembém.

A sua dúvida vem antes da trigger, ja que a trigger roda no banco, não é possível acessar o seu grid.

Então, a lógica precisa estar na aplicação.

As trigguers podem fazer o caminho de mão dupla, desde que, pelo menos uma das colunas seja preenchida, preenchendo automaticamente a que estiver nula, com base no valor da outra.

A questão é, o que fazer quando ambas as colunas são informadas, mas estão inconsistentes.

Por exemplo, se voce insere o valor 10, ''F'', que está errado.

Então, a lógica deve considerar uma destas colunas como sendo prioritária.

Supondo que a coluna identificacao seja a PK e seja considerada a principal. Se ambas forem preenchidas, podendo haver diferença entre os valores, voce deve corrigir o valor da coluna identificacao_hex. Mas, como não da para saber se está errado até comparar, então, pode sempre atribuir.

Ficaria mais ou menos assim:

  if (NEW.identificacao is not null) then
    NEW.identificacao_hex = hex(NEW.identificacao)
  else
    NEW.identificacao = conv(NEW.identificacao_hex, 16, 10);


esta apresentando esse erro

Erro SQL (1064): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '.identificacao_hex = hex(NEW.identificacao)
else
NEW.identificacao = conv...' at line 3 */


Esse if é no interior da trigger, para substituir a atribuição direta.
GOSTEI 1
Alan

Alan

12/06/2023


Desculpe pelo OLD. e o nome da tabela, que eu não ajustei corretamente.

A trigger acima é de update. Se voce faz um update com identificacao_hex nulo, a trigger vai tentar atualizar a coluna identificacao com null também. Voce pode utilizar um if para evitar isso.

No momento do insert, esta trigger não é executada. Alguns bancos aceitam criar triggers com múltiplos eventos (insert or update). Não sei se é o caso do MySQL. Mas voce pode criar outra trigger, para tratar o insert tembém.

A sua dúvida vem antes da trigger, ja que a trigger roda no banco, não é possível acessar o seu grid.

Então, a lógica precisa estar na aplicação.

As trigguers podem fazer o caminho de mão dupla, desde que, pelo menos uma das colunas seja preenchida, preenchendo automaticamente a que estiver nula, com base no valor da outra.

A questão é, o que fazer quando ambas as colunas são informadas, mas estão inconsistentes.

Por exemplo, se voce insere o valor 10, ''F'', que está errado.

Então, a lógica deve considerar uma destas colunas como sendo prioritária.

Supondo que a coluna identificacao seja a PK e seja considerada a principal. Se ambas forem preenchidas, podendo haver diferença entre os valores, voce deve corrigir o valor da coluna identificacao_hex. Mas, como não da para saber se está errado até comparar, então, pode sempre atribuir.

Ficaria mais ou menos assim:

  if (NEW.identificacao is not null) then
    NEW.identificacao_hex = hex(NEW.identificacao)
  else
    NEW.identificacao = conv(NEW.identificacao_hex, 16, 10);


esta apresentando esse erro

Erro SQL (1064): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '.identificacao_hex = hex(NEW.identificacao)
else
NEW.identificacao = conv...' at line 3 */


Esse if é no interior da trigger, para substituir a atribuição direta.


Arthur deu certo assim

if NEW.Identificacao_hex >= 0 then
SET NEW.identificacao = conv(new.identificacao_hex,16,10);
ELSE
SET NEW.Identificacao = NEW.Identificacao;
END IF

oque tava dando o erro de syntax era o begin ,agora pra fechar essa parte de importação, só preciso que quando salvar na tabela, não salve registros que ja tem , so salvar os que ainda nao tem,exemplo se tiver na tabela ele nao faz nada se nao tiver ele salva mas sem dar nenhuma mensagem de que ja existe o registro caso tenha.
mais uma vez muito obrigado por me ajudar.
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

12/06/2023


Arthur deu certo assim

if NEW.Identificacao_hex >= 0 then
SET NEW.identificacao = conv(new.identificacao_hex,16,10);
ELSE
SET NEW.Identificacao = NEW.Identificacao;
END IF

oque tava dando o erro de syntax era o begin ,agora pra fechar essa parte de importação, só preciso que quando salvar na tabela, não salve registros que ja tem , so salvar os que ainda nao tem,exemplo se tiver na tabela ele nao faz nada se nao tiver ele salva mas sem dar nenhuma mensagem de que ja existe o registro caso tenha.
mais uma vez muito obrigado por me ajudar.


Para contextualizar, vamos supor que "um registro existir" signifique que já existe um registro com o mesmo valor de "identificacao" na tabela.

A aplicação pode adotar duas abordagens:

1 - Se o registro já existe, ignora (https://mariadb.com/kb/en/insert-ignore/)
2 - Se o registro já existe, atualiza (https://mariadb.com/kb/en/insert-on-duplicate-key-update/)

Acredito que você possa utilizar essa feature do banco para isso. A cláusula "ON DUPLICATE KEY" do comando insert.
GOSTEI 1
Alan

Alan

12/06/2023


Arthur deu certo assim

if NEW.Identificacao_hex >= 0 then
SET NEW.identificacao = conv(new.identificacao_hex,16,10);
ELSE
SET NEW.Identificacao = NEW.Identificacao;
END IF

oque tava dando o erro de syntax era o begin ,agora pra fechar essa parte de importação, só preciso que quando salvar na tabela, não salve registros que ja tem , so salvar os que ainda nao tem,exemplo se tiver na tabela ele nao faz nada se nao tiver ele salva mas sem dar nenhuma mensagem de que ja existe o registro caso tenha.
mais uma vez muito obrigado por me ajudar.


Para contextualizar, vamos supor que "um registro existir" signifique que já existe um registro com o mesmo valor de "identificacao" na tabela.

A aplicação pode adotar duas abordagens:

1 - Se o registro já existe, ignora (https://mariadb.com/kb/en/insert-ignore/)
2 - Se o registro já existe, atualiza (https://mariadb.com/kb/en/insert-on-duplicate-key-update/)

Acredito que você possa utilizar essa feature do banco para isso. A cláusula "ON DUPLICATE KEY" do comando insert.

Arthur deu uma olhada nos links que vc mandou ,porém segui os exemplos, sem sucesso,se aplico no comando inserto ele da a mensagem (cant update table ingressos in stored function)trigger because it is already used by statement which invoked this stores function ) se aplico no UPDATE não dá mensagem nenhuma mais tbm não faz nada continua como se não tivesse feito gatilho nenhum.
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

12/06/2023


Arthur deu certo assim

if NEW.Identificacao_hex >= 0 then
SET NEW.identificacao = conv(new.identificacao_hex,16,10);
ELSE
SET NEW.Identificacao = NEW.Identificacao;
END IF

oque tava dando o erro de syntax era o begin ,agora pra fechar essa parte de importação, só preciso que quando salvar na tabela, não salve registros que ja tem , so salvar os que ainda nao tem,exemplo se tiver na tabela ele nao faz nada se nao tiver ele salva mas sem dar nenhuma mensagem de que ja existe o registro caso tenha.
mais uma vez muito obrigado por me ajudar.


Para contextualizar, vamos supor que "um registro existir" signifique que já existe um registro com o mesmo valor de "identificacao" na tabela.

A aplicação pode adotar duas abordagens:

1 - Se o registro já existe, ignora (https://mariadb.com/kb/en/insert-ignore/)
2 - Se o registro já existe, atualiza (https://mariadb.com/kb/en/insert-on-duplicate-key-update/)

Acredito que você possa utilizar essa feature do banco para isso. A cláusula "ON DUPLICATE KEY" do comando insert.

Arthur deu uma olhada nos links que vc mandou ,porém segui os exemplos, sem sucesso,se aplico no comando inserto ele da a mensagem (cant update table ingressos in stored function)trigger because it is already used by statement which invoked this stores function ) se aplico no UPDATE não dá mensagem nenhuma mais tbm não faz nada continua como se não tivesse feito gatilho nenhum.


Os comandos INSERT IGNORE ou INSERT ON DUPLICATE ... não são para ser colocados na trigger. Eles devem ser utilizados pela aplicação Delphi, que lê dados do StringGrid e executa os comandos no banco.

Dentro de uma trigger não é possível executar comandos DML na própria tabela da trigger.
GOSTEI 1
Alan

Alan

12/06/2023


Arthur deu certo assim

if NEW.Identificacao_hex >= 0 then
SET NEW.identificacao = conv(new.identificacao_hex,16,10);
ELSE
SET NEW.Identificacao = NEW.Identificacao;
END IF

oque tava dando o erro de syntax era o begin ,agora pra fechar essa parte de importação, só preciso que quando salvar na tabela, não salve registros que ja tem , so salvar os que ainda nao tem,exemplo se tiver na tabela ele nao faz nada se nao tiver ele salva mas sem dar nenhuma mensagem de que ja existe o registro caso tenha.
mais uma vez muito obrigado por me ajudar.


Para contextualizar, vamos supor que "um registro existir" signifique que já existe um registro com o mesmo valor de "identificacao" na tabela.

A aplicação pode adotar duas abordagens:

1 - Se o registro já existe, ignora (https://mariadb.com/kb/en/insert-ignore/)
2 - Se o registro já existe, atualiza (https://mariadb.com/kb/en/insert-on-duplicate-key-update/)

Acredito que você possa utilizar essa feature do banco para isso. A cláusula "ON DUPLICATE KEY" do comando insert.

Arthur deu uma olhada nos links que vc mandou ,porém segui os exemplos, sem sucesso,se aplico no comando inserto ele da a mensagem (cant update table ingressos in stored function)trigger because it is already used by statement which invoked this stores function ) se aplico no UPDATE não dá mensagem nenhuma mais tbm não faz nada continua como se não tivesse feito gatilho nenhum.


Os comandos INSERT IGNORE ou INSERT ON DUPLICATE ... não são para ser colocados na trigger. Eles devem ser utilizados pela aplicação Delphi, que lê dados do StringGrid e executa os comandos no banco.

Dentro de uma trigger não é possível executar comandos DML na própria tabela da trigger.


Ahh sim estava pensando que era na trigger,vou procurar alguns exemplos no delphi.Obrigado.
GOSTEI 0
Alan

Alan

12/06/2023


Arthur deu certo assim

if NEW.Identificacao_hex >= 0 then
SET NEW.identificacao = conv(new.identificacao_hex,16,10);
ELSE
SET NEW.Identificacao = NEW.Identificacao;
END IF

oque tava dando o erro de syntax era o begin ,agora pra fechar essa parte de importação, só preciso que quando salvar na tabela, não salve registros que ja tem , so salvar os que ainda nao tem,exemplo se tiver na tabela ele nao faz nada se nao tiver ele salva mas sem dar nenhuma mensagem de que ja existe o registro caso tenha.
mais uma vez muito obrigado por me ajudar.


Para contextualizar, vamos supor que "um registro existir" signifique que já existe um registro com o mesmo valor de "identificacao" na tabela.

A aplicação pode adotar duas abordagens:

1 - Se o registro já existe, ignora (https://mariadb.com/kb/en/insert-ignore/)
2 - Se o registro já existe, atualiza (https://mariadb.com/kb/en/insert-on-duplicate-key-update/)

Acredito que você possa utilizar essa feature do banco para isso. A cláusula "ON DUPLICATE KEY" do comando insert.

Arthur deu uma olhada nos links que vc mandou ,porém segui os exemplos, sem sucesso,se aplico no comando inserto ele da a mensagem (cant update table ingressos in stored function)trigger because it is already used by statement which invoked this stores function ) se aplico no UPDATE não dá mensagem nenhuma mais tbm não faz nada continua como se não tivesse feito gatilho nenhum.


Os comandos INSERT IGNORE ou INSERT ON DUPLICATE ... não são para ser colocados na trigger. Eles devem ser utilizados pela aplicação Delphi, que lê dados do StringGrid e executa os comandos no banco.

Dentro de uma trigger não é possível executar comandos DML na própria tabela da trigger.



Ahh sim estava pensando que era na trigger,vou procurar alguns exemplos no delphi.Obrigado.


Arthur,não consegui fazer essa parte do INSERT IGNORE OU O INSERT ON DUPLICATE , da para fazer nesse codigo,ou teria que mudar a estrutura do codigo,para fazer com parametros tipo o ParamByName ?

procedure TFrmImportacao.BtnImportDadosClick(Sender: TObject);
Var I : integer;
Row : Integer;

begin
if LkSetor.text = '' then
begin
ShowMessage('Selecione o setor!');
LkSetor.SetFocus;
exit;
end;
if Application.MessageBox('Deseja importar dados da aba selecionada para esse setor?','Atenção',MB_ICONQUESTION+MB_YESNO) =mrYes then
begin
Gauge1.Max := Pred(AdvGridWorkbook1.Grid.RowCount);
Gauge1.Position := 0;

for I := 1 to Pred( AdvGridWorkbook1.Grid.RowCount) do
begin
Application.ProcessMessages;
IngressosTable.Append;

if CbHex.Checked then
begin
IngressosTablehexa_identific.Value := AdvGridWorkbook1.Grid.Cells[1, i];
IngressosTableIdentificacao.Value := Unassigned;
end
else
begin
IngressosTableIdentificacao.Value := AdvGridWorkbook1.Grid.Cells[1, i];
end;

IngressosTableNome.Value := AdvGridWorkbook1.Grid.Cells[2, i];
IngressosTableSetor.Value := LkSetor.Text;
IngressosTableId_setor.Value := LkSetor.KeyValue;
IngressosTablenumero_setor.value := FDsetornumero.Value;
IngressosTableDocumento.Value := AdvGridWorkbook1.Grid.Cells[4, i];


IngressosTable.post;

Gauge1.Position := I;
label2.Caption:=IntToStr(I)+' de '+IntToStr(Pred(AdvGridWorkbook1.Grid.RowCount));
end;
ShowMessage('Importado com Sucesso');
i := AdvGridWorkbook1.ActiveSheet;
AdvGridWorkbook1.RemoveSheet(AdvGridWorkbook1.ActiveSheet);
AdvGridWorkbook1.ActiveSheet := I;
Label1.Caption := IntToStr( AdvGridWorkbook1.Grid.RowCount-1);
end;
end;
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

12/06/2023

Como eu não tenho o hábito de utilizar os componentes visuais para fazer o acesso/modificação de dados, não sei se existe uma maneira de fazer isso utilizando o seu código.

Me lembro vagamente de ter visto em algum lugar que dava para associar o comando a ser executado pelo componente, mas posso estar viajando.

Se eu fosse fazer isso, eu utilizaria um componente do tipo TQuery, onde eu utilizaria o comando "insert..." utilizando parâmetros, para ser utilizado com o comando "prepare", seguido de vários execs com valores de parâmetros diferentes.
GOSTEI 0
POSTAR