Tipos de datos (data types) del motor de base de datos SGBD MySQL Server: TinyInt, Bit, Bool, SmallInt, MediumInt, Integer, BigInt, DateTime, VarChar, LongBlob, etc. Explicamos cuando utilizarlos, el rango mínimo, el rango máximo y el tamaño que ocupan. Con algunos ejemplos sobre creación de tablas en MySQL Server con estos tipos de datos. Explicamos los tipos de datos espaciales de MySQL.

Definición MySQL

MySQL es un sistema de gestión de base de datos (SGBD) relacional, multihilo y multiusuario. MySQL AB desarrolla MySQL como software libre en un esquema de licenciamiento dual: por un lado se ofrece bajo la licencia GNU GPL, pero aquellas empresas que quieran incorporarlo en productos privativos deben comprar una licencia específica que les permita este uso. Está desarrollado en su mayor parte en ANSI C.

MySQL es propietario de su código fuente y está patrocinado por una empresa privada, que posee el copyright de la mayor parte del código. Esto es lo que posibilita el esquema de licenciamiento anteriormente mencionado. Además de la venta de licencias privativas, la compañía ofrece soporte y servicios.

Hay que hacer mención de que MySQL AB fue comprada en enero de 2008 por Sun Microsystems y ésta, a su vez, fue comprada por Oracle Corporation en abril de 2009. Por lo que, si no se establece lo contrario jurídicamente (en los comités que tengan que evaluar la validez de esta compra), MySQL pertenece a Oracle Corporation.

Algunas de las características de las últimas versiones de MySQL son:

  • Soportan un amplio subconjunto de ANSI SQL 99.
  • Soporte a multiplataforma (Windows, GNU Linux, Unix, AIX, BSD, HP-UX, Mac OS X, NetBSD, Novell Netware, OpenBSD, OS/2 Warp, Solaris, SunOS, SCO OpenServer, SCO UnixWare, Tru64, etc.).
  • Procedimientos almacenados.
  • Disparadores (triggers).
  • Cursores.
  • Vistas actualizables.
  • Soporte de tipo de datos VARCHAR.
  • Modo Strict.
  • Soporte X/Open XA de transacciones distribuidas; transacción en dos fases como parte de esto, utilizando el motor InnoDB de Oracle.
  • Motores de almacenamiento independientes (MyISAM para lecturas rápidas, InnoDB para transacciones e integridad referencial).
  • Transacciones con los motores de almacenamiento InnoDB, BDB y Cluster; puntos de recuperación (savepoints) con InnoDB.
  • Soporte para SSL.
  • Query caching.
  • Sub-SELECTs (o SELECTs anidados).
  • Réplica con un maestro por esclavo, varios esclavos por maestro, sin soporte automático para múltiples maestros por esclavo.
  • Embedded database library.
  • Soporte completo para Unicode.
  • Shared-nothing clustering through MySQL Cluster.
  • Usa GNU Automake, Autoconf, y Libtool para portabilidad.
  • Uso de multihilos mediante hilos del kernel.
  • Usa tablas en disco b-tree para búsquedas rápidas con compresión de índice.
  • Tablas hash en memoria temporales.
  • El código MySQL se prueba con Purify (un detector de memoria perdida comercial) así como con Valgrind, una herramienta GPL.
  • Completo soporte para operadores y funciones en cláusulas select y where.
  • Completo soporte para cláusulas group by y order by, soporte de funciones de agrupación.
  • Seguridad: ofrece un sistema de contraseñas y privilegios seguro mediante verificación basada en el host y el tráfico de contraseñas está cifrado al conectarse a un servidor.
  • Soporta gran cantidad de datos.
  • Se permiten hasta 64 índices por tabla. Cada índice puede consistir desde 1 hasta 16 columnas o partes de columnas. El máximo ancho de límite son 1000 bytes.
  • Los clientes se conectan al servidor MySQL usando sockets TCP/IP en cualquier plataforma. En sistemas Windows se pueden conectar usando named pipes y en sistemas Unix usando ficheros socket Unix.
  • Los clientes y servidores Windows se pueden conectar usando memoria compartida.
  • MySQL contiene su propio paquete de pruebas de rendimiento proporcionado con el código fuente de la distribución de MySQL.
  • Foreign keys (claves foráneas), a partir de la versión 6.
  • Soporte para XML (a partir de la versión 6).

Las siguientes características son implementadas únicamente por MySQL (no las tienen otros motores de base de datos):

  • Múltiples motores de almacenamiento (MyISAM, Merge, InnoDB, BDB, Memory/heap, MySQL Cluster, Federated, Archive, CSV, Blackhole y Example en 5.x), permitiendo al usuario escoger la que sea más adecuada para cada tabla de la base de datos, dependiendo del uso que se le vaya a dar.
  • Agrupación de transacciones, reuniendo múltiples transacciones de varias conexiones para incrementar el número de transacciones por segundo.

MySQL AB clasifica sus productos de la siguiente forma:

  • MySQL Enterprise: incluye MySQL Enterprise Server, Monitoreo de la red MySQL, servicios de consulta y soporte de producción MySQL
  • MySQL Cluster.
  • MySQL Embedded Database.
  • MySQL Drivers: para JDBC, ODBC y .Net.
  • MySQL Tools: MySQL Administrator, MySQL Query Browser y MySQL Migration Toolkit.
  • MaxDB: es una base de datos open source certificada para SAP/R3.

Tipos de datos de MySQL Server

A continuación os mostramos los tipos de datos (data types) que se pueden definir para el motor de base de datos MySQL:

GrupoTipo de datoIntervaloAlmacenamiento
NuméricosTINYINTDe -128 a 127 (signed)
De
0 a 255 (unsigned)
1 byte
SMALLINTDe -32768 a 32767 (signed)
De 0 a 65535 (unsigned)
2 bytes
MEDIUMINTDe -8388608 a 8388607 (signed)
De 0 a 16777215 (unsigned)
3 bytes
INT
INTEGER
De -2147483648 a 2147483647 (signed)
De 0 a 4294967295 (unsigned)
4 bytes
BIGINTDe -9223372036854775808 a 9223372036854775807 (signed)
De 0 a 18446744073709551615 (unsigned)
8 bytes
BITEquivalente a TINYINT(1)1 byte
BOOL
BOOLEAN
Equivalente a TINYINT(1)
Valor 0 = False
Valor 1 = True
1 byte
FLOAT [(M,D)]De -3.402823466E+38 a -1.175494351E-38, 0, y desde 1.175494351E-38 a 3.402823466E+38

 

M es el número total de dígitos y D es el número de dígitos después del punto decimal. Si se omite M y D, los valores se almacenan en los límites permitidos por el hardware (unas 7 posiciones decimales)

4 bytes
FLOAT (p)p representa la precisión en bits, MySQL usa este valor sólo para determinar si se debe usar FLOAT o DOUBLE para el tipo de datos resultante.

 

Si p está entre 0 a 24, el tipo de datos se convierte en FLOAT (sin M ó D). Si p está entre 25 a 53, el tipo de datos se convierte a DOUBLE (sin M ó D).

En realidad este tipo de datos es proporcionado por MySQL por compatibilidad con ODBC

4 bytes si 0 <= p <= 24, 8 bytes si 25 <= p <= 53
DOUBLE [(M,D)]De -1.7976931348623157E+308 a -2.2250738585072014E-308, 0, y desde 2.2250738585072014E-308 a 1.7976931348623157E+308

 

M es el número total de dígitos y D es el número de dígitos después del punto decimal. Si se omite M y D, los valores se almacenan en los límites permitidos por el hardware (unas 15 posiciones decimales)

8 bytes
REAL[(M,D)]
DOUBLE PRECISION
Equivalente a DOUBLE, con la excepción de que si está activado el modo REAL_AS_FLOAT, REAL es un sinónimo de FLOAT en lugar de DOUBLE4 Bytes ó 8 bytes
DECIMAL [(M[,D])]
DEC [(M[,D])]
NUMERIC [(M[,D])]
FIXED[(M[,D])]
Número en coma flotante sin empaquetar. Se comporta como una columna CHAR. El número se almacena como una cadena, usando un carácter para cada dígito del valor.

 

El rango máximo es el mismo que para el tipo DOUBLE

M+2 bytes sí D > 0
M+1 bytes sí D = 0
D+2, si M < D
Fecha y horaDATEFecha, con rango desde ‘1000-01-01’ a ‘9999-12-31’ con formato ‘YYYY-MM-DD’3 bytes
DATETIMEFecha y hora, con rango desde ‘1000-01-01 00:00:00’ a ‘9999-12-31 23:59:59’ con formato ‘YYYY-MM-DD HH:MM:SS’8 bytes
TIMESTAMP[(M)]Fecha y hora, el rango va desde ‘1970-01-01 00:00:01’ UTC a ‘2038-01-19 03:14:07’ UTC. El formato de almacenamiento depende del tamaño del campo4 bytes
TIMEHora, con rango desde ‘-838:59:59’ a ‘838:59:59’, con el formato ‘HH:MM:SS’3 bytes
YEAR[(2|4)]Año en dos o cuatro dígitos, para cuatro dígitos, el rango es de 1901 a 2155, para dos dígitos es de 70 a 69 (representando desde 1070 a 2069)1 byte
Cadenas de caracteresCHAR (M)Almacena una cadena de longitud fija. La cadena podrá contener desde 0 a 255 caracteresM bytes (tanto si se ocupan como si no)
VARCHAR (M)Almacena una cadena de longitud variable. La cadena podrá contener desde 0 a 255 caracteresTamaño contenido del campo más 1 byte
BINARY (M)Similar a CHAR, excepto que contiene cadenas de caracteres binarias en lugar de cadenas no binarias. Es decir, que contienen cadenas de bytes en lugar de cadenas de caracteres. Esto significa que no tienen conjunto de caracteres, y la comparación y ordenación se basa en los valores numéricos de los bytes en los valoresM bytes, 0 <= M <= 255
VARBINARY (M)Similar a VARCHAR, excepto que contiene cadenas de caracteres binarias en lugar de cadenas no binarias. Es decir, que contienen cadenas de bytes en lugar de cadenas de caracteres. Esto significa que no tienen conjunto de caracteres, y la comparación y ordenación se basa en los valores numéricos de los bytes en los valoresTamaño contenido del campo más 1 byte
TEXTTipo de datos no binario que puede contener una cantidad variable de datos. Sirve para almacenar texto (gran cantidad). Hasta 65535 caracteresLongitud + 2 bytes, mientras L < 216
TINYTEXTipo de datos no binario que puede contener una cantidad variable de datos. Sirve para almacenar texto (gran cantidad). Hasta 255 caracteresLongitud + 1 bytes, mientras L < 28
MEDIUMTEXTTipo de datos no binario que puede contener una cantidad variable de datos. Sirve para almacenar texto (gran cantidad). Hasta 16.777.215 caracteresLongitud + 3 bytes, mientras L < 224
LONGTEXTTipo de datos no binario que puede contener una cantidad variable de datos. Sirve para almacenar texto (gran cantidad). Hasta 4.294.967.295 caracteresLongitud + 4 bytes, mientras L < 232
BLOBTipo de datos binario que puede contener una cantidad variable de datos. Permite almacenar ficheros (de cualquier tipo). Hasta 65535 bytesLongitud + 2 bytes, mientras L < 216
TINYBLOBTipo de datos binario que puede contener una cantidad variable de datos. Permite almacenar ficheros (de cualquier tipo). Hasta 255 bytesLongitud + 1 bytes, mientras L < 28
MEDIUMBLOBTipo de datos binario que puede contener una cantidad variable de datos. Permite almacenar ficheros (de cualquier tipo). Hasta 16.777.215 bytesLongitud + 3 bytes, mientras L < 224
LONGBLOBTipo de datos binario que puede contener una cantidad variable de datos. Permite almacenar ficheros (de cualquier tipo). Hasta 4.294.967.295 bytesLongitud + 4 bytes, mientras L < 232
ENUM (valor1, valor2, …)Es un tipo de datos de cadena con un valor elegido de una lista de valores permitidos que se enumeran explícitamente en la especificación de la columna al crear la tabla. Acepta hasta 65535 valores distintos1 ó 2 bytes, dependiendo del número de valores de ENUM
SET (valor1, valor2, …)Es un tipo de datos de cadena que puede contener ninguno, uno ó varios valores de una lista previamente establecida (al crear la tabla). La lista puede tener un máximo de 64 valores1, 2, 3, 4, ó 8 bytes, dependiendo del número de miembros del conjunto
Tipos de datos espaciales (Open Gis) (*)GEOMETRYGeometry es la clase base de la jerarquía para el modelo geométrico OpenGIS. Es una clase no instanciable, pero tiene unas cuantas propiedades que son comunes para todos los valores geométricos creados con cualquiera de las subclases de Geometry 
POINTUn POINT es una geometría que representa una ubicación única en un espacio de coordenadas (valor de la coordenada X, valor de la coordenada Y) 
LINESTRINGUn LINESTRING es una Curva con interpolación linear entre puntos. Un LINESTRING tiene coordenadas de segmentos, definidos por cada par consecutivo de puntos 
POLYGONUn POLYGON es una superficie planar que representa una geometría multicara. Se define por un único límite exterior y cero o más límites interiores, donde cada límite interior define un agujero en el polígono 
MULTIPOINTUn MULTIPOINT es una colección de geometrías compuesta de elementos Point. Los puntos no están conectados ni ordenados de ningún modo 
MULTILINESTRINGUna MULTILINESTRING es una colección de geometrías MultiCurve compuesta de elementos LINESTRING 
MULTIPOLYGONUn MULTIPOLYGON es un objeto MultiSurface compuesto de elementos POLYGON 
GEOMETRYCOLLECTIONUna GEOMETRYCOLLECTION es una geometría que consiste en una colección de una o más geometrías de cualquier clase.

 

Todos los elementos en una GEOMETRYCOLLECTION deben estar en el mismo Sistema de Referencia Espacial (es decir, en el mismo sistema de coordenadas)

 
CURVEUna clase CURVE es una geometría unidimensional, normalmente representada por una secuencia de puntos. Las subclases particulares de CURVE definen el tipo de interpolación entre puntos. CURVE es una clase no instanciable 
MULTICURVEUna clase MULTICURVE es una colección de geometrías que se compone de elementos CURVE. MULTICURVE es una clase no instanciable 
 SURFACEUna clase SURFACE es una geometría bidimensional. Es una clase no instanciable. Su única subclase instanciable es POLYGON 

(*) MySQL implementa extensiones espaciales siguiendo la especificación del Consorcio Open GIS (OGC), un consorcio internacional de más de 250 compañías, agencias y universidades que participan en el desarrollo de soluciones conceptuales públicamente disponibles y que pueden ser útiles para todo tipo de aplicaciones que manejan datos espaciales. MySQL implementa un subconjunto del entorno SQL con Tipos Geométricos propuesto por el OGC. Este término se refiere a un entorno SQL que ha sido extendido con un conjunto de tipos geométricos. Una columna SQL con valores geométricos se implementa como una columna que tiene un tipo geométrico. Las especificaciones describen un conjunto de tipos geométricos SQL, así como las funciones para analizar y crear valores geométricos sobre esos tipos.

Ejemplo de creación de tablas en MySQL

Os indicamos algunos ejemplos de creación de tablas con algunos de los tipos de datos anteriores:

  1. Tabla para guardar documentos (gestor documental):
  1. Tabla de usuarios (login) para acceso a aplicación:
  1. Tabla de facturas, para software de facturación:
  1. Tabla detalle (líneas) de factura, para software de facturación:

Nota: para ejecutar estas consultas SQL podremos utilizar MySQL Query Browser (herramienta gratuita de MySQL) o cualquier software que permita ejecutar consultas SQL contra MySQL, como por ejemplo nuestro software gratuito y 100% Open Source: