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
. MySQL 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), MySQL armazena o valor correspondente
ao final daquela faixa.
Como uma extensão do padrão ANSI/ISO SQL92, MySQL também
suporta os tipos integrais TINYINT
,
MEDIUMINT
, e BIGINT
como
listado nas tabelas abaixo. Outra extensão suportada pelo MySQL
é 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 MySQL gerar tabelas temporárias para algum join
complicado, já que nestes casos o MySQL 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 MySQL 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 MySQL também suporta esta
especificação opcional de precisão. Quando
FLOAT
é usada para uma tipo de coluna sem
especificação de precisão, MySQL 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 MySQL 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 MySQL 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
, MySQL 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 MySQL 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.
Tipo | Bytes | De | Até |
TINYINT |
1 | -128 | 127 |
SMALLINT |
2 | -32768 | 32767 |
MEDIUMINT |
3 | -8388608 | 8388607 |
INT |
4 | -2147483648 | 2147483647 |
BIGINT |
8 | -9223372036854775808 | 9223372036854775807 |
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.