Volver a MySQL Básico
Tipos de Datos en MySQL
Tipos Numéricos
CREATE TABLE productos (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
precio DECIMAL(10, 2) NOT NULL, -- exacto para dinero
descuento FLOAT, -- aprox. para ciencia
stock SMALLINT UNSIGNED DEFAULT 0,
vistas BIGINT UNSIGNED DEFAULT 0,
activo TINYINT(1) DEFAULT 1, -- booleano
calificacion DOUBLE PRECISION -- punto flotante doble
);
| Tipo | Rango | Almacenamiento |
|---|---|---|
| TINYINT | -128 a 127 / 0 a 255 | 1 byte |
| SMALLINT | -32768 a 32767 | 2 bytes |
| INT | -2.1B a 2.1B | 4 bytes |
| BIGINT | ±9.2 quintillones | 8 bytes |
| DECIMAL | Exacto, configurable | Variable |
Tipos de Cadena
CREATE TABLE contenidos (
id INT PRIMARY KEY AUTO_INCREMENT,
codigo CHAR(10), -- longitud fija
nombre VARCHAR(100) NOT NULL, -- longitud variable
descripcion TEXT, -- hasta 65KB
cuerpo MEDIUMTEXT, -- hasta 16MB
estado ENUM('borrador','publicado','archivado') DEFAULT 'borrador',
etiquetas SET('mysql','database','sql') -- múltiples valores
);
Tipos de Fecha y Hora
CREATE TABLE eventos (
id INT PRIMARY KEY AUTO_INCREMENT,
creado_en DATETIME DEFAULT CURRENT_TIMESTAMP,
actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
fecha_evento DATE NOT NULL,
inicio TIME,
anio_fiscal YEAR
);
Columnas JSON
CREATE TABLE configuracion (
id INT PRIMARY KEY AUTO_INCREMENT,
usuario INT NOT NULL,
prefs JSON
);
INSERT INTO configuracion (usuario, prefs) VALUES (
1,
'{"tema": "oscuro", "notificaciones": {"email": true, "push": false}, "idioma": "es"}'
);
-- Acceder a valores JSON
SELECT
usuario,
JSON_EXTRACT(prefs, '$.tema') AS tema,
prefs->>'$.idioma' AS idioma; -- operador de acceso
-- Actualizar un campo JSON
UPDATE configuracion
SET prefs = JSON_SET(prefs, '$.tema', 'claro')
WHERE usuario = 1;
-- Buscar en columnas JSON
SELECT * FROM configuracion
WHERE JSON_EXTRACT(prefs, '$.notificaciones.email') = true;
Columnas Generadas
CREATE TABLE pedidos (
id INT PRIMARY KEY AUTO_INCREMENT,
subtotal DECIMAL(10,2) NOT NULL,
impuesto DECIMAL(10,2) NOT NULL,
-- columna generada almacenada (persiste en disco)
total DECIMAL(10,2) GENERATED ALWAYS AS (subtotal + impuesto) STORED,
-- columna generada virtual (calculada al vuelo)
iva_tax DECIMAL(10,2) GENERATED ALWAYS AS (subtotal * 0.16) VIRTUAL
);
Particionamiento
-- Particionar por rango (p.ej. por año)
CREATE TABLE ventas (
id INT NOT NULL,
monto DECIMAL(10,2),
fecha_venta DATE NOT NULL
)
PARTITION BY RANGE (YEAR(fecha_venta)) (
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION pfuturo VALUES LESS THAN MAXVALUE
);
-- Consultar en una partición específica
SELECT * FROM ventas PARTITION (p2023);