Eu quero armazenar muitos registros em um banco de dados MySQL. Todos eles contêm valores monetários. Mas não sei quantos dígitos serão inseridos para cada um.
Que tipo de dados eu tenho que usar para esse fim?
VARCHAR ou INT (ou outros tipos de dados numéricos)?
mysql
sqldatatypes
currency
Mohammad Saberi
fonte
fonte
deimal(10,2)
é o que eu uso ... você pode ajustar os valores, dependendo do tamanho esperadoRespostas:
Como o dinheiro precisa de uma representação exata, não use tipos de dados que sejam apenas aproximados
float
. Você pode usar um tipo de dados numérico de ponto fixo para algo como15
é a precisão (comprimento total do valor, incluindo casas decimais)2
é o número de dígitos após o ponto decimalVeja Tipos Numéricos do MySQL :
fonte
decimal
enumeric
são os mesmos.numeric(19,4)
para registros financeiros que oferecem uma mão melhor para você jogar e adotar novos pedidos com facilidade.Você pode usar
DECIMAL
ouNUMERIC
ambos são iguaisie
DECIMAL(10,2)
Boa leitura
fonte
Eu prefiro usar
BIGINT
e armazenar os valores multiplicando por 100 , para que ele se torne um número inteiro.Por exemplo, para representar um valor de moeda de
93.49
, o valor deve ser armazenado como9349
, ao exibir o valor que podemos dividir por 100 e exibir. Isso ocupará menos espaço de armazenamento.fonte
DECIMAL
? Você cria a necessidade de converter moedas de um centavo para dólares, e ai se você a esquecer em algum momento.$0.005
ou$0.12345
) porque eles não serão reduzidos a um número inteiro depois de multiplicados por 100. Se você souber a precisão dos valores, desmarque a caixa A melhor opção é usarDECIMAL
. Mas se você não souber a precisão (como nos meus exemplos), então… seriaFLOAT
apropriado?Depende da sua necessidade.
Usar
DECIMAL(10,2)
normalmente é suficiente, mas se você precisar de valores um pouco mais precisos, poderá definirDECIMAL(10,4)
.Se você trabalha com grandes valores, substitua
10
por19
.fonte
Se o seu aplicativo precisar lidar com valores monetários de até um trilhão, isso deve funcionar: 13,2 Se você precisar cumprir os GAAP (princípios de contabilidade geralmente aceitos), use: 13,4
Normalmente, você deve somar seus valores monetários em 13,4 antes de arredondar a saída para 13,2.
fonte
De fato, isso depende das preferências do programador. Eu pessoalmente uso:
numeric(15,4)
para estar em conformidade com os princípios contábeis geralmente aceitos ( GAAP ) .fonte
Tente usar
isso geralmente funciona com todos os outros bancos de dados também
fonte
Nós usamos
double
.*suspiro*
Por quê?
Porque ele pode representar qualquer número de 15 dígitos sem restrições sobre onde está o ponto decimal . Tudo por um mísero 8 bytes!
Portanto, pode representar:
0.123456789012345
123456789012345.0
... e qualquer coisa no meio.
Isso é útil porque estamos lidando com moedas globais e
double
pode armazenar os vários números de casas decimais que provavelmente encontraremos.Um único
double
campo pode representar 999.999.999.999.999s em ienes japoneses, 9.999.999.999.999.999s em dólares americanos e até 9.999.999.9999999999s em bitcoinsSe você tentar fazer o mesmo
decimal
, precisará de umdecimal(30, 15)
custo de 14 bytes.Ressalvas
Claro, o uso
double
não é sem ressalvas.No entanto, não é perda de precisão, como alguns tendem a apontar. Mesmo que
double
ele próprio não seja internamente exato para o sistema base 10 , podemos torná-lo exato arredondando o valor que extraímos do banco de dados para suas casas decimais significativas. Se necessário, é isso. (por exemplo, se for produzido, e a representação da base 10 é necessária.)As advertências são: sempre que executamos aritmética com ele, precisamos normalizar o resultado (arredondando-o para suas casas decimais significativas) antes de:
Outro tipo de ressalva é que, diferentemente de
decimal(m, d)
onde o banco de dados impedirá que os programas insiram um número com mais dem
dígitos, essas validações não existemdouble
. Um programa pode inserir um valor digitado pelo usuário de 20 dígitos e acabará sendo gravado silenciosamente como uma quantidade imprecisa.fonte
1.410000000000
(doze casas decimais significativas), mas multiplicando isso por 1.000.000.000.000 (que são 13 dígitos significativos à esquerda do ponto decimal) significa que estamos trabalhando em menos 25 dígitos combinados de significância. Isso supera em muito os 15 disponíveis para um duplo, então, em termos de design, acho que seria muito quebrado.Na época, essa pergunta foi feita e ninguém pensou no preço do Bitcoin. No caso do BTC, provavelmente é insuficiente para usar
DECIMAL(15,2)
. Se o Bitcoin subir para US $ 100.000 ou mais, precisaremos pelo menosDECIMAL(18,9)
oferecer suporte a criptomoedas em nossos aplicativos.DECIMAL(18,9)
ocupa 12 bytes de espaço no MySQL ( 4 bytes por 9 dígitos ).fonte
Armazenar dinheiro
BIGINT
multiplicado por 100 ou mais com o motivo de usar menos espaço de armazenamento não faz sentido em todas as situações "normais".DECIMAL(13,4)
DECIMAL
.DECIMAL(13,4)
representa 9 dígitos + 4 dígitos da fração (casas decimais) => 4 + 2 bytes = 6 bytesBIGINT
.fonte
Se a conformidade com o GAAP for necessária ou você precisar de quatro casas decimais:
DECIMAL (13, 4) Que suporta um valor máximo de:
$ 999.999.999.9999
Caso contrário, se duas casas decimais forem suficientes: DECIMAL (13,2)
src: https://rietta.com/blog/best-data-types-for-currencymoney-in/
fonte
Multiplica 10000 e armazena como BIGINT, como "Moeda" no Visual Basic e no Office. Consulte https://msdn.microsoft.com/en-us/library/office/gg264338.aspx
fonte