Converter hexadecimal para decimal no MySql
12/06/2023
0
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
Post mais votado
12/06/2023
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 ;
Arthur Heinrich
Mais Posts
12/06/2023
Alan
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?
13/06/2023
Arthur Heinrich
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);
13/06/2023
Alan
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 */
13/06/2023
Arthur Heinrich
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.
13/06/2023
Alan
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.
14/06/2023
Arthur Heinrich
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.
15/06/2023
Alan
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.
15/06/2023
Arthur Heinrich
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.
16/06/2023
Alan
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.
19/06/2023
Alan
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;
19/06/2023
Arthur Heinrich
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.
Clique aqui para fazer login e interagir na Comunidade :)