quinta-feira, 27 de outubro de 2011

Como armazenar informações do tipo Moeda

Tela preta com textos sql's
Constantemente vejo alguns colegas (novatos em sua maioria) questionando em fóruns qual o tipo de dados deve ser utilizado para armazenar valores.

A resposta é simples, mas pode variar de banco de dados para banco de dados.

Em sua maioria, o mais utilizado é o Decimal, pois podemos especificar a quantidade de casas decimais queremos trabalhar.

1:  Decimal(length,precision)  

Vejamos um exemplo:
1:  decimal(7,2)  

Neste campo poderemos armazenar valores na casa de milhões.

Sempre utilizei o decimal no MySql e no PostGres, já no SQL Server, além do Decimal temos o Money que também armazena este tipo de dados.

No Oracle, temos o Number(p,s), que tem o mesmo proposito do Decimal

Uma curiosidade no MySql é que, o banco armazena as informações como string ao invés de um número de ponto-flutuante binário, isto para preservar a precisão decimal destes valores.

Uma característica forte para o uso do Decimal é que, tipos como FLOAT ou DOUBLE não retornam precisão em seus resultados, vejamos um exemplo:

 delimiter $$  
 CREATE TABLE `trabalhando_com_valores` (  
  `id` bigint(20) NOT NULL AUTO_INCREMENT,  
  `valor` double DEFAULT NULL,  
  `valor_2` double DEFAULT NULL,  
  PRIMARY KEY (`id`)  
 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8$$  

 Insert Into trabalhando_com_valores(valor,valor_2)  
 Values(10.52,8.73)  

De posse dos registros, façamos uma simples subtração:

 Select (valor - valor_2) as result   
 From trabalhando_com_valores  

 result   
 1.7899999999999991  

Logo, se precisar de valores precisos, evite o uso destes tipos de dados.

Um abraço e até a próxima.

5 comentários:

  1. Valew, tava procurando isso msm!

    ResponderExcluir
  2. legal, exatamente que procurava!

    ResponderExcluir
  3. Galera coloquei uma funçãozinha bem bacana pra retornar R$ no post abaixo...

    http://paposql.blogspot.com.br/2011/12/funcao-para-formatar-moeda-em-reais-no.html

    ResponderExcluir