MySQL soporta todos los tipos de datos SQL numéricos estándard.
Estos tipos incluyen los tipos numéricos exactos
(INTEGER
, SMALLINT
,
DECIMAL
, y NUMERIC
), así
como los tipos de datos aproximados (FLOAT
,
REAL
, y DOUBLE PRECISION
).
La palabra clave INT
es sinónimo de
INTEGER
, y la palabra clave
DEC
es sinónimo de DECIMAL
.
En MySQL 5.0.3, un tipo de datos BIT
está
disponible para almacenar valores de un bit. (Antes de 5.0.3,
MySQL interpreta BIT
como
TINYINT(1)
.) En MySQL 5.0.3,
BIT
lo soporta sólo tablas
MyISAM
. MySQL 5.0.5 extiende soporte de
BIT
para MEMORY
,
InnoDB
, y BDB
.
Como extensión de los estándards SQL, MySQL soporta los tipos
enteros TINYINT
, MEDIUMINT
,
y BIGINT
. La siguiente tablas muestra el
almacenamiento requerido y el rango para cada uno de los tipos
enteros.
Tipo | Bytes | Valor Mínimo | Valor Máximo |
(Con signo/Sin signo) | (Con signo/Sin signo) | ||
TINYINT
|
1 |
-128
|
127
|
0
|
255
|
||
SMALLINT
|
2 |
-32768
|
32767
|
0
|
65535
|
||
MEDIUMINT
|
3 |
-8388608
|
8388607
|
0
|
16777215
|
||
INT
|
4 |
-2147483648
|
2147483647
|
0
|
4294967295
|
||
BIGINT
|
8 |
-9223372036854775808
|
9223372036854775807
|
0
|
18446744073709551615
|
MySQL soporta otra extensión para especificar de forma óptima el
ancho a mostrar de un tipo entero en paréntesis después de la
palabra clave para el tipo (por ejemplo,
INT(4)
). Esta especificación opcional del
ancho de muestra se usa para alinear a la izquierda la muestra de
los valores con ancho menor que el ancho especificado para la
columna.
El ancho de muestra no restringe el rango de valores que pueden almacenarse en la columna, no el número de dígitos que se muestran para valores con ancho que exceda el especificado para la columna.
Cuando se usa en conjunción con el atributo de extensión
opcional ZEROFILL
, el relleno por defecto de
espacios se replaza por ceros. Por ejmplo, para una columna
declarada como INT(5) ZEROFILL
, un valor de
4
se muestra como 00004
.
Tenga en cuenta que si almacena valores mayores que el ancho de
muestra en una columna entera, puede tener problemas cuando MySQL
genera tablas temporales para algunos joins complicados, ya que en
estos casos MySQL cree que los datos encajan en el ancho original
de la columna.
Todos los tipos enteros pueden tener un atributo opcional (no
estándard) UNSIGNED
. Los valores sin signo
pueden usarse cuando quiere permitir sólo números no negativos
en una columna y necesita un rango numérico mayor para la
columna.
Tipos de coma flotante y de coma fija pueden ser
UNSIGNED
. Como con los tipos enteros, este
atributo evita que los valores negativos se almacenen en la
columna. Sin embargo, a diferencia de los tipos enteros, el rango
superior de los valores de la columna sigue siendo el mismo.
Si especifica ZEROFILL
para una columna
numérica, MySQL añade automáticamente el atributo
UNSIGNED
a la columna.
Para columnas de tipo coma flotante, MySQL usa cuatro bytes para valores de precisión simple y ocho bytes para valores de doble precisión.
El tipo FLOAT
se usa para representar tipos
numéricos aproximados. El estándard SQL permite una
especificación opcional de la precisión (pero no del rango del
exponente) en bits a continación de la palabra clave
FLOAT
entre paréntesis. La implementación de
MySQL soporta esta especificación opcional de precisión, pero el
valor de precisión se usa sólo para determinar el tamaño de
almacenamiento. Una precisión de 0 a 23 resulta en una columna de
precisión simple de cuatro bytes de tamaño
FLOAT
. Una precisión de 24 a 53 resulta en
una columna de doble precisión de ocho bytes de tamaño
DOUBLE
.
Cuando se especifica la palaba clave FLOAT
para
tipos de columnas sin especificar la precisión, MySQSL usa cuatro
bytes para almacenar los valors.MySQL también soporta una
sintaxis alternativa con dos números entre paréntesis a
continación de la palabra clave FLOAT
. El
primer número representa el ancho a mostrar y el segundo número
especifica el número de dígitos a almacenar a continuación del
punto decimal ( como con DECIMAL
y
NUMERIC
). Cuando se pide a MySQL que almacene
un número para tales columnas con más dígitos decimales a
continuación del punto decimal del especificado para la columna,
el valor se redondea para elminar los dígitos extras cuando se
almacena el valor.
En SQL estándard, los tipos REAL
y
DOUBLE PRECISION
no aceptan especificaciones de
precisión. MySQL soporta una sintaxis alternativa con dos
números dados entre paréntesis a continuación del nombre del
tipo. El primer número representa el ancho a mostrar y el segundo
número especifica el número de dígitos a almacenar y mostrar a
continuación del punto decimal. Como una extensión al estándard
SQL, MySQL reconoce DOUBLE
como sinónimo del
tipo DOUBLE PRECISION
. En contraste con el
requerimiento estándard que la precisión para
REAL
sea menor que la usada para
DOUBLE PRECISION
, MySQL implementa ambas como
valores de punto flotante de doble precisión con tamaño de ocho
bytes (a no ser que el modo SQL del servidor incluya la opción
REAL_AS_FLOAT
).
Para portabilidad máxima, el código que requiera almacenamiento
de datos numéricos aproximados debe usar FLOAT
o DOUBLE PRECISION
sin especificar la
precisión ni el número de dígitos decimales.
Los tipos DECIMAL
y NUMERIC
se implementan como el mismo tipo en MySQL. Se usan para guardar
valores para los que es importante preservar una precisión
exacta, por ejemplo con datos monetarios. Cuando se declara una
columna de alguno de estos tipos, la precisión y la escala puede
especificarse (y usualmente se hace), por ejemplo:
salary DECIMAL(5,2)
En este ejemplo, 5
es la precisión y
2
es la escala. La precisión representa el
número de dígitos decimales significativos que se almacenan para
los valores, y la escala representa el número de dígitos que
pueden almacenarse a continuación del punto decimal.
Desde MySQL 5.0.3, los valores DECIMAL
y
NUMERIC
se almacenan en formato binario. Antes
de 5.0.3, MySQL almacena los valores DECIMAL
y
NUMERIC
como cadenas de carácteres, en lugar
de binario. .Un carácter se usa para cada dígito del valor, el
punto decimal (si la escala es mayor que 0), y el signo
'-
' (para números negativos). Si la escala es
0, los valores DECIMAL
y
NUMERIC
no contienen punto decimal o parte
fraccional.
SQL estándard requiere que la columna salary
sea capaz de almacenar cualquier valor con cinco dígitos y dos
decimales. En este caso, por lo tanto, el rango de valores que
puede almacenarse en la columna salary
es desde
-999.99
a 999.99
. MySQL
fuerza este límite desde MySQL 5.0.3. Antes de 5.0.3, MySQL 5.0
variaba este límite de forma que, en el límite positivo del
rango, la columna podía almacenar números hasta
9999.99
. (Para números positivos, MySQL 5.0.2
y anteriores usaba el byte reservado para el signo para extender
el límite superior del rango.)
En SQL estándard, la sintaxis
DECIMAL(
M
) es
equivalente a
DECIMAL(
M
,0).
Similarmente, la sintaxis DECIMAL
es
equivalente a
DECIMAL(
M
,0), donde
la implementación se permite para decidir el valor de
M
. Ambas formas de los tipos
DECIMAL
y NUMERIC
se
soportan en MySQL 5.0. El valor por defecto de
M
es 10.
El máximo rango de los valores DECIMAL
y
NUMERIC
es el mismo para
DOUBLE
, pero el rango real para un valor dado
en una columna DECIMAL
o
NUMERIC
puede restringirse con la precisión o
escala para una columna dada. Cuando en tal columna se asigna un
valor con más dígitos siguiendo el punto decimal de los
permitidos por la escala específica, el valor se convierte a tal
escala. (El comportamiento preciso depende del sistema operativo,
pero generalmente el efecto es que se trunca al número de
dígitos permitidos.)
Desde MySQL 5.0.3, el tipo de datos BIT
puede
usarse para guardar valores de un bit. Un tipo
BIT(
M
) permite el
almacenamiento de valores de M
-bit .
M
tiene un rango de 1 a 64.
Para especificar valores bit, puede usar la notación
b'
value
' .
value
es un valor binario escrito
usando ceros y unos. Por ejemplo, b'111'
y
b'100000000'
representan 7 y 128,
respectivamente. Consulte Sección 9.1.5, “Valores de bits”.
Si asigna un valor a una columna
BIT(
M
) con menos de
M
bits , el valor se alinea a la
izquierda con ceros. Por ejemplo, asignar un valor
b'101'
a una columna BIT(6)
es, en efecto, lo mismo que asignar b'000101'
.
Cuando se intenta almacenar un valor en una columna numérica que está fuera del rango permitido por la columna, MySQL corta el valor en el final del rango permitido y guarda el valor resultante.
Por ejemplo, el ranto de una coluna INT
es de
-2147483648
a 2147483647
. Si
intenta insertar -9999999999
en una columna
INT
, MySQL reemplaza el valor con el mínimo
valor del rango y almacena -2147483648
en su
lugar. De forma similar, si trata de insertar
9999999999
, MySQL reemplaza el valor con el
valor máximo del rango y almacena 2147483647
en su lugar.
Si la columna INT
es
UNSIGNED
, el tamaño del rango de la columna es
el mismo, pero los límites cambian a 0
y
4294967295
. Si intenta almacenar
-9999999999
y 9999999999
,
los valores almacenados en la columna son 0
y
4294967296
.
Cuando se asigna un valor fuera de rango especificado (o por defecto) a una columna de coma flotante o fija, MySQL almacena el valor representado por el valor correspondiente al límite de rango correspondiente.
Las conversiones debidas a valores fuera de rango se reportan como
advertencias para los comandos ALTER TABLE
,
LOAD DATA INFILE
, UPDATE
, y
INSERT
de múltiples registros.