Como usar o MySQL DECIMAL?

177

Não consigo entender o DECIMAL do MySQL. Eu preciso da linha para poder conter um número entre 00.0001 e 99.9999. Como eu a estruturaria para funcionar assim?

Charles Zink
fonte
8
(Referência) dev.mysql.com/doc/refman/5.1/en/…
Pekka
4
Você realmente deve aceitar a resposta correta. A resposta atualmente aceita está errada.
28612 Olhovsky
2
Terminou aqui e leia a resposta alegando que DECIMAL UNSIGNED não é possível. Veja a nova resposta abaixo para obter as especificações corretas para isso.
Markus AO

Respostas:

439

As colunas DUPLAS não são iguais às colunas DECIMAIS, e você terá problemas se usar as colunas DUPLO para dados financeiros.

DOUBLE é na verdade apenas uma versão de precisão dupla (64 bits em vez de 32 bits) do FLOAT . Os números de ponto flutuante são representações aproximadas de números reais e não são exatos. De fato, números simples como 0,01 não têm uma representação exata nos tipos FLOAT ou DOUBLE.

As colunas DECIMAIS são representações exatas, mas ocupam muito mais espaço para um intervalo muito menor de números possíveis. Para criar uma coluna capaz de armazenar valores de 0,0001 a 99,9999, como você pediu, você precisaria da seguinte instrução

CREATE TABLE your_table
(
    your_column DECIMAL(6,4) NOT NULL
);

A definição da coluna segue o formato DECIMAL (M, D), em que M é o número máximo de dígitos (a precisão ) e D é o número de dígitos à direita do ponto decimal (a escala ).

Isso significa que o comando anterior cria uma coluna que aceita valores de -99.9999 a 99.9999. Você também pode criar uma coluna DECIMAL NÃO ASSINADA, variando de 0,0000 a 99,9999.

Para mais informações sobre o MySQL DECIMAL, os documentos oficiais são sempre um ótimo recurso.

Tenha em mente que todas essas informações são verdadeiras para as versões do MySQL 5.0.3 e superior. Se você estiver usando versões anteriores, você realmente deve atualizar.

Alex Recarey
fonte
17
Votou na sua resposta. Sua resposta está correta, a outra resposta não está (pois afirma que "double = decimal"). DECIMAL é um tipo de ponto fixo com um valor exato e seus sinônimos são NUMERIC, DEC e FIXED. Não é DOUBLE, porque DOUBLE é um tipo de ponto flutuante que representa valores de dados numéricos aproximados. Ao usar DECIMAL (<1-65>, <0-30>), o primeiro parâmetro é o número de dígitos, o segundo o número de dígitos à direita do ponto decimal.
Norbert
2
Sim você está certo. Tome nota que é um trabalho para o MySQL 5.0.3 em diante, dev.mysql.com/doc/refman/5.1/en/precision-math-examples.html
ajreal
1
O pôster solicitava um campo decimal que continha valores entre 0,0001 e 99,9999. Adicionei algumas informações extras para esclarecer que o campo criado realmente suporta valores de -99.9999 a 99.9999. Obrigado pelo feedback! Também foi adicionado o aviso de isenção de versão do MySQL.
precisa saber é o seguinte
1
Você disse "Não há como criar uma coluna DECIMAL" não assinada ", mas seu exemplo de código indica" DECIMAL (6,4) NÃO ASSINADO NÃO NULO ". Por que é isso?
Liang
3
@AlexRecarey Parece que consigo criar um DECIMAL UNSIGNED muito bem; e o manual para MySQL 5.x concorda: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. Ele retornará um erro fora da faixa para valores negativos. Você também pode criar FLOAT e DOUBLE não assinados. Manual: dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html
Markus AO
67

Embora as respostas acima pareçam corretas, apenas uma explicação simples para lhe dar uma idéia de como funciona.

Suponha que sua coluna esteja configurada para ser DECIMAL(13,4). Isso significa que a coluna terá um tamanho total de 13 dígitos, onde 4 deles serão usados ​​para representação de precisão.

Portanto, em resumo, para essa coluna, você teria um valor máximo de: 999999999.9999

Cristiano
fonte
1
melhor resposta aqui
Julian Silvestri
15

Existem soluções corretas nos comentários, mas para resumi-las em uma única resposta:

Você precisa usar DECIMAL (6,4).

Então você pode ter 6 número total de dígitos, 2 antes e 4 após o ponto decimal (a escala). Pelo menos de acordo com isso .

Zoltán Hajdú
fonte
6

5.x MySQL especificação de tipo de dados decimal é: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. A resposta acima está errada ao dizer que decimais não assinados não são possíveis.

Para definir um campo permitindo que somente decimais não assinados, com um comprimento total de 6 dígitos, dos quais 4 casas decimais, você usaria: DECIMAL (6,4) UNSIGNED.

Você também pode criar tipos de dados FLOAT e DOUBLE não assinados (isto é, não negativos).

Markus AO
fonte