Tipos Numéricos
MySQL suporta todos os tipos numéricos da ANSI/ISO SQL92. Estes tipos incluem o tipos de dados numéricos exatos (NUMERIC
, DECIMAL
, INTEGER
, e SMALLINT
), assim como o tipos de dados numéricos aproximados (FLOAT
, REAL
, e DOUBLE PRECISION
). A palavra-chave INT
é um sinônimo para INTEGER
, e a palavra-chave DEC
é um sinônimo para DECIMAL
.
Os tipos NUMERIC
e DECIMAL
são implementados como o mesmo tipo pelo MySQL, como permitido pelo padrão SQL92. Eles são usados por valores para os quais é importante preservar a exatidão como, por exemplo, dados monetários. Quando é declarado um campo de algum desses tipos a precisão e a escala podem ser (e normalmente é) especificadas; por exemplo:
salario DECIMAL(5,2)
Neste exemplo, 5
(precisão
) representa o número de digitos decimais significantes que serão armazenados no valor, e 2
(escala
) representa o número de dígitos que serão armazenados após o ponto decimal. Neste caso, no entanto, a faixa de valores que podem ser armazendos na coluna salario
é de -99.99
a 99.99
. (MySQL pode, na verdade, armazenar numeros acima de 999.99
neste campo porque ele não precisa armazenar o sinal para números positivos).
Em ANSI/ISO SQL92, a sintaxe DECIMAL(p)
é equivalente a DECIMAL(p,0)
. Da mesma forma, a sintaxe DECIMAL
é equivalente a DECIMAL(p,0)
, onde a implementação permite decidir o valor de p
. MariaDB ainda não suporta nenhuma dessas duas formas variantes dos tipos de dados DECIMAL
/NUMERIC
. Este, geralmente, não é um problema sério, já que os principais benefícios destes tipos derivam da habilidade de controlar precisão e escala explicitamente.
Valores DECIMAL
e NUMERIC
são armazenados como strings, ao invés de um número de ponto-flutuante binário, para preservar o precisão decimal destes valores. Um caracter é usado para cada digito, para o ponto decimal (se escala
> 0), e para o sinal '-
' (para números negativos). Se escala
é 0, valores DECIMAL
e NUMERIC
não contém ponto decimal ou parte fracionária.
A faixa máxima dos valores DECIMAL
e NUMERIC
é o mesmo do DOUBLE
, mas a faixa real para um campo DECIMAL
or NUMERIC
pode ser limitado pela precisão
ou pela escala
para uma dada coluna. Quando é atribuído a uma coluna um valor com mais digitos após o ponto decimal do que o permitido especificado na escala
, o valor é arredondado para aquela escala
. Quando é atribuido um valor a uma coluna DECIMAL
ou NUMERIC
o qual excede a faixa determinada pelas precisão
e escala
especificada (ou padrão), MariaDB armazena o valor correspondente ao final daquela faixa.
Como uma extensão do padrão ANSI/ISO SQL92, MariaDB também suporta os tipos integrais TINYINT
, MEDIUMINT
, e BIGINT
como listado nas tabelas abaixo. Outra extensão suportada pelo MariaDB é especificar, opcionalmente, o tamanho do display de um valor inteiro entre parenteses seguindo o nome do tipo (por exemplo, INT(4)
). Esta especificação opcional do tamanho é usada para preenchimento a esquerda do display de valores cujo tamanho é menor que o especificado para a coluna, mas não limita a faixa de valores que podem ser armazendos na coluna, nem o número de dígitos que serão mostrados para valores que excederem o tamanho especificado na coluna. Quando usados em conjunto com o atributo opcional de extensão ZEROFILL
, o padrão do preenchimento de espaços é a substituição por zeros. Por exemplo, para uma coluna declarada com INT(5) ZEROFILL
, o valor 4
é retornado como 00004
. Note que se você armazenar valores maiores que a largura do display em um coluna do tipo inteiro, você pode ter problemas quando o MariaDB gerar tabelas temporárias para algum join complicado, já que nestes casos o MariaDB acredita que os dados cabem na largura original da coluna.
Todos os tipos inteiros podem ter um atributo opcional (não-padrão) UNSIGNED
. Valores sem sinal podem ser usados quando você permite apenas números positivos em uma coluna e você precisa de uma faixa de valores um pouco maior para a coluna.
Desde o MariaDB 4.0.2, tipos de ponto flutuante também podem ser sem sinal (UNSIGNED
). Como no tipos inteiros, este atributoprevine que valores negativos sejam armazenados na coluna. Ao contrário dos tipos negativos, o valor máximo da faixa permitida permanece o mesmo.
O tipo FLOAT
é usado para representar tipos de dados numéricos aproximados. O padrão SQL-92 permite uma especificação opcional da precisão (mas não da faixa do expoente) em bits, após a a palavra FLOAT
e entre parenteses. A implementação MariaDB também suporta esta especificação opcional de precisão. Quando FLOAT
é usada para uma tipo de coluna sem especificação de precisão, MariaDB utiliza quatro bytes para armazenar os valores. Uma sintaxe variante também é suportada, com dois numeros entre parenteses após a palavra FLOAT
. Com esta opção, o primeiro número continua a representar a quantidade de bytes necessária para armazenar o valor, e o segundo número especifica o número de dígitos a serem armazenados e mostrados após o ponto decimal (como com DECIMAL
e NUMERIC
). Quando é pedido ao MariaDB para armazenar um número em uma coluna com mais digitos decimais após o ponto decimal que o especificado para esta coluna, o valor é arredondado eliminando os digitos extras quando armazenado.
Os tipos REAL
e DOUBLE PRECISION
não aceitam especificações de precisão. Como uma extensão do padrão SQL-92, o MariaDB reconhece DOUBLE
como um sinônimo para o tipo DOUBLE PRECISION
. Em constraste com a exigencia do padrão de que a precisão do tipo REAL
seja menor que aquele usado pelo DOUBLE PRECISION
, MariaDB implementa ambos como valores de ponto flutuante de 8 bits de dupla precisão (quando não estiver executando em modo ANSI
). Para uma portabilidade máxima, códigos que requerem armazenamento de valores de dados numéricos aproximados usam FLOAT
ou DOUBLE PRECISION
sem especificação de precisão ou de numeros decimais.
Quando solicitado a armazenar um valor em uma coluna numérica que está fora da faixa permitida pelo tipo da coluna, o MariaDB ajusta o valor ao limite da faixa permitida mais apropriado e armazena este valor.
Por exemplo, a faixa de uma coluna INT
é de -2147483648
a 2147483647
. Se você tentar inserir -9999999999
em uma coluna INT
, o valor é ajustado para o limite mais baixo da faixa de valores e -2147483648
é armazenado. Da mesma forma, se você tentar inserir 9999999999
, 2147483647
será armazenado.
Se o campo INT
é UNSIGNED
, o tamanho da faixa do campo é o mesmo mas o limite passa a ser de 0
a 4294967295
. Se você tentar armazenar -9999999999
e 9999999999
, os valores armazenados na coluna serão 0
e 4294967296
.
Conversões que ocorrem devido a ajustes são relatados como avisos
para ALTER TABLE
, LOAD DATA INFILE
, UPDATE
, e instruções INSERT
multi-registros.