Capítulo 11. Tipos de columna
From MySQL 5.0
Tabla de contenidos
MySQL soporta un número de tipos de columnas divididos en varias categorías: tipos númericos, tipos de fecha y hora, y tipos de cadenas de carácteres. Este capítulo primero hace un repaso de estos tipos de columnas, y luego proporciona una descripción detallada de las propiedades de los tipos de cada categoría, y un resumen de sus requerimientos de almacenamiento. El repaso es intencionalmente breve. Las descripciones más detalladas deben consultarse para obtener más información acerca de los tipos de datos particulares, como los formatos permitidos para especificar los tipos.
MySQL 5.0 soporta extensiones para tratar datos espaciales. Información al respecto se proporciona en Capítulo 18, Extensiones espaciales de MySQL.
Varias descripciones de los tipos de columnas usan estas convenciones:
-
MIndica la máxima anchura al mostrar los datos. El máximo ancho de muestra es 255.
-
DSe aplica a tipos de coma flotante y de coma fija e indica el número de dígitos a continuación del punto decimal. El valor máximo posible es 30, pero no debe ser mayor que
M-2. -
Los corchetes ('
[' y ']') indican partes de especificadores de tipos que son opcionales.
A continuación hay un resumen de los tipos de columnas
numéricos. Para información adicional, consulte
Sección 11.2, “Tipos numéricos”. Los requerimientos de
almacenamiento de columna se dan en
Sección 11.5, “Requisitos de almacenamiento según el tipo de columna”.
M indica la anchura máxima para
mostrar. La anchura máxima es 255. La anchura de muestra no
tiene nada que ver con el tamaño de almacenamiento o el rango
de valores que el valor puede contener, como se describe en
Sección 11.2, “Tipos numéricos”.
Si especifica ZEROFILL para columnas
numéricas,, MySQL añade automáticamente el atributo
UNSIGNED en la columna.
SERIAL es un alias para BIGINT
UNSIGNED NOT NULL AUTO_INCREMENT.
SERIAL DEFAULT VALUE en la definición de una
columna de tipo entero es un alias para NOT NULL
AUTO_INCREMENT UNIQUE.
Atención: Debe tener en cuenta
que cuando usa la resta entre valores enteros cuando uno de los
operandos es de tipo UNSIGNED, el resultado
no tiene signo. Consulte Sección 12.8, “Funciones y operadores de cast”.
-
BIT[(M)]
En un tipo de datos bit. M indica
el número de bits por valor, de 1 a 64. El valor por
defecto es 1 si se omite M .
Este tipo de datos se añadió en MySQL 5.0.3 para
MyISAM, una extensión en 5.0.5 para
MEMORY, InnoDB, y
BDB. Antes de 5.0.3,
BIT es un sinónimo de
TINYINT(1).
-
TINYINT[(M)] [UNSIGNED]
[ZEROFILL]
Un entero muy pequeño. El rango con signo es de
-128 a 127. El rango
sin signo es de 0 a
255.
-
BOOL, BOOLEAN
Son sinónimos para TINYINT(1). Un valor
de cero se considera falso. Valores distintos a cero se
consideran ciertos.
En el futuro, se introducirá tratamiento completo de tipos
booleanos según el estándard SQL.
-
SMALLINT[(M)] [UNSIGNED]
[ZEROFILL]
Un entero pequeño. El rango con signo es de
-32768 a 32767. El
rango sin signo es de 0 a
65535.
-
MEDIUMINT[(M)]
[UNSIGNED] [ZEROFILL]
Entero de tamaño medio. El rango con signo es de
-8388608 a 8388607. El
rango sin singo es de 0 a
16777215.
-
INT[(M)] [UNSIGNED]
[ZEROFILL]
Un entero de tamaño normal. El rango con signo es de
-2147483648 a
2147483647. El rango sin signo es de
0 a 4294967295.
-
INTEGER[(M)] [UNSIGNED]
[ZEROFILL]
Es un sinónimo de INT.
-
BIGINT[(M)] [UNSIGNED]
[ZEROFILL]
Un entero grande. El rango con signo es de
-9223372036854775808 a
9223372036854775807. El rango sin signo
es de 0 a
18446744073709551615.
Algunos aspectos a considerar con respecto a las columnas
BIGINT :
-
Toda la aritmética se hace usando valores
BIGINT o DOUBLE,
así que no debe usar enteros sin signos mayores que
9223372036854775807 (63 bits)
except con funciones bit! Si lo hace, algunos de los
últimos dígitos en el resultado pueden ser erróneos
por culpa de errores de redondeo al convertir valores
BIGINT a DOUBLE.
MySQL 5.0 puede tratar BIGINT en
los siguientes casos:
-
Cuando usa enteros para almacenar valores grandes
sin signo en una columna BIGINT
.
-
En
MIN(col_name)
o
MAX(col_name),
donde col_name se
refiere a una columna BIGINT .
-
Al usar operadores (+,
-, *, y
así) donde ambos operadores son enteros.
-
Siempre puede guardar un valor entero exacto en un
columna BIGINT almacenándolo
usando una cadena de carácteres. En este caso, MySQL
realiza una conversión cadena de carácteres-número
que no implica representación de doble precisión
intermedia.
-
Los operadores -,
+, y * usan
BIGINT en operaciones aritméticas
cuando ambos operandos son valores enteros. Esto
significa que si multiplica dos enteros grandes (o
resultados de funciones que devuelven enteros), puede
obtener resultados inesperados cuando el resultado es
mayor que 9223372036854775807.
-
FLOAT(p) [UNSIGNED]
[ZEROFILL]
Número con coma flotante. p
representa la precisión. Puede ir de 0 a 24 para números
de coma flotante de precisión sencilla y de 25 a 53 para
números de coma flotante con doble precisión. Estos tipos
son como los tipos FLOAT y
DOUBLE descritos a continuación.
FLOAT(p) tiene le mismo rango que los
tipos correspondientes FLOAT y
DOUBLE, pero la anchura de muestra y el
número de decimales no están definidos.
En MySQL 5.0, este es un valor de coma flotante auténtico.
Esta sintaxis se proprociona para compatibilidad con ODBC.
Usar FLOAT puede darle algunos problemas
inesperados ya que todos los cálculos se en MySQL se hacen
con doble precisión. Consulte
Sección A.5.7, “Resolver problemas con registros que no salen”.
-
FLOAT[(M,D)]
[UNSIGNED] [ZEROFILL]
Un número de coma flotante pequeño (de precisión simple).
Los valores permitidos son de
-3.402823466E+38 a
-1.175494351E-38, 0, y
de 1.175494351E-38 a
3.402823466E+38. Si se especifica
UNSIGNED, los valores negativos no se
permiten. M es la anchura de
muestra y D es el número de
dígitos significativos. FLOAT sin
argumentos o
FLOAT(p)
(donde p está en el rango de 0 a
24) es un número de coma flotante con precisión simple.
-
DOUBLE[(M,B)]
[UNSIGNED] [ZEROFILL]
Número de coma flotante de tamaño normal (precisión
doble). Los valores permitidos son de
-1.7976931348623157E+308 a
-2.2250738585072014E-308,
0, y de
2.2250738585072014E-308 a
1.7976931348623157E+308. Si se especifica
UNSIGNED, no se permiten valores
negativos. M es la anchura de
muestra y B es el número de bits
de precisión. DOUBLE sin parámetros o
FLOAT(p)
(donde p está en el rango de 25
a 53) es un número de coma flotante con doble precisión.
Un número de coma flotante con precision sencilla tiene una
precisión de 7 decimales aproximadamente; un número con
coma flotante de doble precisión tiene una precisión
aproximada de 15 decimales.
-
DOUBLE
PRECISION[(M,D)]
[UNSIGNED] [ZEROFILL],
REAL[(M,D)]
[UNSIGNED] [ZEROFILL]
Son sinónimos de DOUBLE. Excepción: Si
el modo del servidor SQL incluye la opción
REAL_AS_FLOAT, REAL es
un sinónimo para FLOAT en lugar de
DOUBLE.
-
DECIMAL[(M[,D])]
[UNSIGNED] [ZEROFILL]
A partir de MySQL 5.0.3:
Número de punto fijo exacto y empaquetado.
M es el número total de dígitos
y D es el número de decimales.
El punto decimal y (para números negativos) el signo
'-' no se tiene en cuenta en
M. Si
D es 0, los valores no tienen
punto decimal o parte fraccional. El máximo número de
dígitos (M) para
DECIMAL es 64. El máximo número de
decimales soportados (D) es 30.
Si UNSIGNED se especifica, no se permiten
valores negativos.
Si se omite D, el valor por
defecto es 0. Si se omite M, el
valor por defecto es 10.
Todos los cálculos básicos (+, -, *, /)
con columnas DECIMAL se hacen con
precisión de 64 dígitos decimales.
Antes de MySQL 5.0.3:
Número de punto decimal fijo sin empaquetar. Se comporta
como una columna CHAR ; "sin
empaquetar" significa que el número se alacena como
una cadena de carácteres, usando un carácter para cada
dígito del valor. M es el
número total de dígitos y D es
el número de decimales. El punto decimal y (para números
negativos) el signo '-' no se cuenta en
M, aunque se reserva espacio para
él. Si D es 0, los valores no
tienen punto decimal ni parte fraccional. El máximo rango
de los valores DECIMAL es el mismo que
para DOUBLE, pero el rango real para una
columna DECIMAL dada puede estar
restringido por la elección de M
y D. Si se especifica
UNSIGNED no se permiten números
negativos.
Si se omite D, el valor por
defecto es 0. Si se omite M, el
valor por defecto es 10.
-
DEC[(M[,D])]
[UNSIGNED] [ZEROFILL],
NUMERIC[(M[,D])]
[UNSIGNED] [ZEROFILL],
FIXED[(M[,D])]
[UNSIGNED] [ZEROFILL]
Son sinónimos para DECIMAL. El sinónimo
FIXED está disponible por compatibilidad
con otros servidores.
Un resumen de los tipos de columnas temporales se muestra a
continuación. Para información adicional, consulte
Sección 11.3, “Tipos de fecha y hora”. Los requerimientos de
almacenamiento se dan en Sección 11.5, “Requisitos de almacenamiento según el tipo de columna”.
-
DATE
Una fecha. El rango soportado es de
'1000-01-01' a
'9999-12-31'. MySQL muestra valores
DATE en formato
'YYYY-MM-DD', pero permite asignar
valores a columnas DATE usando cadenas de
carácteres o números.
-
DATETIME
Combinación de fecha y hora. El rango soportado es de
'1000-01-01 00:00:00' a
'9999-12-31 23:59:59'. MySQL muestra
valores DATETIME en formato
'YYYY-MM-DD HH:MM:SS', pero permite
asignar valores a las columnas DATETIME
usando cadenas de carácteres o números.
-
TIMESTAMP[(M)]
Una marca temporal. El rango es de '1970-01-01
00:00:00' hasta el año 2037.
Una columna TIMESTAMP es útil para
registrar la fecha y hora de una operación
INSERT o UPDATE . La
primera columna TIMESTAMP en una tabla se
rellena automáticamente con la fecha y hora de la
operación más reciente si no le asigna un valor. Puede
asignar a cualquier columna TIMESTAMP la
fecha y hora actual asignándole un valor
NULL .
En MySQL 5.0, TIMESTAMP se retorna como
una cadena de carácteres en el formato 'YYYY-MM-DD
HH:MM:SS' cuya anchura de muestra son 19
carácteres. Si quiere obtener el valor como un número,
debe añadir +0 a la columa timestamp .
-
TIME
Una hora. El rango es de '-838:59:59' a
'838:59:59'. MySQL muestra los valores
TIME en formato
'HH:MM:SS', pero permite asingar valores
a columnas TIME usando números o cadenas
de carácteres.
-
YEAR[(2|4)]
Un año en formato de dos o cuatro dígitos. El valor por
defecto está en formato de cuatro dígitos. En formato de
cuatro dígitos, los valores permitidos son de
1901 a 2155, y
0000. En formato de dos dígitos, los
valores permitidos son de 70 a
69, representando los años de 1970 a
2069. MySQL muestra los valores YEAR en
formato YYYY pero permite asignar valores
a columnas YEAR usando cadenas de
carácteres o números.
Un resumen de los tipos de columnas de cadenas de carácteres se
muestra a continuación. Para información adicional, consulte
Sección 11.4, “Tipos de cadenas de caracteres”. Los requerimientos de
almacenamiento de estas columnas se dan en
Sección 11.5, “Requisitos de almacenamiento según el tipo de columna”.
En algunos casos, MySQL puede cambiar una columna de cadena de
carácteres a un tipo diferente para un comando CREATE
TABLE o ALTER TABLE . Consulte
Sección 13.1.5.1, “Cambios tácitos en la especificación de columnas”.
Los tipos de cadenas de carácteres MySQL 5.0 incluyen algunas
características que puede que no haya encontrado trabajando con
versiones anteriores de MySQL anteriores a la 4.1:
-
Las definiciones de columnas para varios tipos de datos de
cadenas de carácteres incluyen un atributo
CHARACTER SET para especificar el
conjunto de carácteres y, ocasionalmente, una colación.
(CHARSET es sinónimo de
CHARACTER SET.) Estos atributos se
aplican a los tipos CHAR,
VARCHAR, TEXT,
ENUM, y SET. Por
ejemplo:
CREATE TABLE t
(
c1 CHAR(20) CHARACTER SET utf8,
c2 CHAR(20) CHARACTER SET latin1 COLLATE latin1_bin
);
Esta definición de tabla crea una columna llamada
c1 que tiene un conjunto de carácteres
utf8 con la colación por defecto para
ese conjunto de carácteres, y una columna llamada
c2 que tiene el conjunto de carácteres
latin1 y la colación binaria para el
conjunto de carácteres. La colación binaria no es sensible
a mayúsculas.
-
MySQL 5.0 interpreta las especificaciones de longitud en las
definiciones de las columnas en unidades de carácteres .
(En algunas versiones anteriores de MySQL la longitud se
interpreta en bytes.)
-
Para los tipos CHAR,
VARCHAR, y the TEXT,
el atributo BINARY hace que se asigne a
la columna la colación binaria del conjunto de carácteres.
-
Las ordenaciones y comparaciones de las columnas de tipo
carácter se basan en el conjunto de carácteres asignado a
la columna. Para versiones anteriores, la comparación y
ordenación se basan en la colación del conjunto de
carácteres del servidor. Para columnas
CHAR y VARCHAR, puede
declarar que la columna con el atributo
BINARY realice la ordenación y la
comparación usando los códigos de los valores subyacentes
en lugar del orden léxico.
Para más información acerca del soporte de conjuntos de
carácteres en MySQL 5.0, consulte Capítulo 10, Soporte de conjuntos de caracteres.
-
[NATIONAL] CHAR(M)
[BINARY | ASCII | UNICODE]
Una cadena de carácteres de longitud fija que siempre tiene
el número necesario de espacios a la derecha para ajustarla
a la longitud especificada al almacenarla.
M representa la longitud de la
columna. El rango de M en MySQL
5.0 es de 0 a 255 carácteres.
Nota: Los espacios a la
derecha se borran cuando se obtiene los valores
CHAR .
Antes de MySQL 5.0.3, una columna CHAR
con una longitud especificada mayor que 255 se convierte al
tipo TEXT más pequeño que pueda tener
los valores de la longitud dada. Por ejemplo,
CHAR(500) se convierte a
TEXT, y CHAR(200000)
se convierte en MEDIUMTEXT. Esta es una
característica de compatibilidad. Sin embargo, esta
conversión causa que la columna tenga longitud variable, y
también afecta a la eliminación de espacios.
CHAR es una abreviatura para
CHARACTER. NATIONAL
CHAR (o su forma equivalente de,
NCHAR) es la forma estándard de SQL de
definir que una columna CHAR debe usar el
conjunto de carácteres por defecto. Este es el
comportamiento por defecto en MySQL.
El atributo BINARY es una abreviatura
para especificar la colación binaria del conjunto de
carácteres de la columna. La ordenación y comparación se
basa en los valores numéricos de los carácteres.
El tipo de columna CHAR BYTE es un alias
para CHAR BINARY. Esta es una
característica de compatibilidad.
El atributo ASCII puede especificarse
para CHAR. Asigna el conjunto de
carácteres latin1.
El atributo UNICODE puede especificarse
en MySQL 5.0 para CHAR. Asigna el
conjunto de carácteres ucs2 .
MySQL le permite crear un tipo de columna
CHAR(0). Esto es útil cuando tiene que
cumplir con las especificaciones de alguna aplicación vieja
que dependa de la existencia de una columna pero que no usa
realmente el valor. Esto es también útil cuando necesita
una columna que sólo pueda tener dos valores: Una columna
CHAR(0) que no esté definido como
NOT NULL ocupa sólo un bit y sólo puede
tener dos valores NULL y
'' (la cadena de carácteres vacía).
-
CHAR
Es un sinónimo de CHAR(1).
-
[NATIONAL] VARCHAR(M)
[BINARY]
Cadena de carácteres de longitud variable.
M representa la longitud de
columna máxima. En MySQL 5.0, el rango de
M es de 0 a 255 antes de MySQL
5.0.3, y de 0 a 65,535 en MySQL 5.0.3 y posterior. (La
longitud máxima real de un VARCHAR en
MySQL 5.0 se determina por el tamaño de registro máximo y
el conjunto de carácteres que use. La longitud máxima
efectiva desde MySQL 5.0.3 es de 65,532
bytes.)
Nota: Antes de 5.0.3, los
espacios finales se eliminaban cuando se almacenaban los
valores VARCHAR, lo que difiere de le
especificación estándard de SQL.
Previo a MySQL 5.0.3, una columna VARCHAR
con una longitud especificada mayor a 255 se convertía al
valor de tipo TEXT más pequeño que
podía soportar el valor de la longitu dada. Por ejemplo,
VARCHAR(500) se convertía a
TEXT, y
VARCHAR(200000) se convertía a
MEDIUMTEXT. Esto era una cuestión de
compatibilidad. Sin embargo, esta conversión afectaba la
eliminación de espacios finales.
VARCHAR es la abreviación de
CHARACTER VARYING.
En MySQL 5.0, el atributo BINARY es
abreviatura para especificar la colación binaria del
conjunto de carácteres de la columna. La ordenación y la
comparación se basa en los valores numéricos de los
carácteres.
Desde MySQL 5.0.3, VARCHAR se guarda con
un prefijo de longitud de uno o dos bytes + datos. La
longitud del prefijo es de dos bytes si la columna
VARCHAR se declara con una longitud mayor
a 255.
-
BINARY(M)
El tipo BINARY es similar al tipo
CHAR, pero almacena cadenas de datos
binarios en lugar de cadenas de carácteres no binarias.
-
VARBINARY(M)
El tipo VARBINARY es similar al tipo
VARCHAR, pero almacena cadenas de
carácteres binarias en lugar de cadenas de carácteres no
binarias.
-
TINYBLOB
Una columna BLOB con una longitud máxima
de 255 (2^8 - 1) bytes.
-
TINYTEXT
Una columna TEXT con longitud máxima de
255 (2^8 - 1) carácteres.
-
BLOB[(M)]
Una columna BLOB con longitud máxima de
65,535 (2^16 - 1) bytes.
Una longitud opcional M puede
darse para este tipo en MySQL 5.0. Si se hace, MySQL creará
las columnas como el tipo BLOB de tamaño
mínimo para tratar los valores de
M bytes.
-
TEXT[(M)]
Una columna TEXT con longitud máxima de
65,535 (2^16 - 1) carácteres.
En MySQL 5.0, se puede dar una longitud opcional
M . En ese caso MySQL creará las
columnas con el tipo TEXT de longitud
mínima para almacenar los valors de longitud
M .
-
MEDIUMBLOB
Una columna BLOB con longitud de
16,777,215 (2^24 - 1) bytes.
-
MEDIUMTEXT
Una columna TEXT con longitud máxima de
16,777,215 (2^24 - 1) carácteres.
-
LONGBLOB
Una columna BLOB con longitud máxima de
4,294,967,295 o 4GB (2^32 - 1) bytes. La longitud máxima
efectiva (permitida) de las columnas
LONGBLOB depende del tamaño máximo
configurado para los paquetes en el protocolo
cliente/servidor y la memoria disponible.
-
LONGTEXT
Una columna TEXT con longitud máxima de
4,294,967,295 or 4GB (2^32 - 1) carácteres. La longitud
máxima efectiva (permitida) de
columnas LONGTEXT depende del tamaño
máximo de paquete configurado en el protocolo
cliente/servidor y la memoria disponible.
-
ENUM('value1','value2',...)
Una enumeración. Un objeto de cadena de carácteres que
sólo puede tener un valor, elegido de una lista de valores
'value1',
'value2',
..., NULL o el valor
de error especial '' . Una columna
ENUM puede tener un máximo de 65,535
valores distintos. Los valores ENUM se
representan internamente como enteros.
-
SET('value1','value2',...)
Un conjunto. Un objeto de cadena de carácteres que puede
tener cero o más valores que deben pertencer a la lista de
valores
'value1',
'value2',
... Una columna SET
puede tener un máximo de 64 miembros. Los valores
SET se representan internamente como
enteros.