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 );
TipoRangoAlmacenamiento
TINYINT-128 a 127 / 0 a 2551 byte
SMALLINT-32768 a 327672 bytes
INT-2.1B a 2.1B4 bytes
BIGINT±9.2 quintillones8 bytes
DECIMALExacto, configurableVariable

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);