Contenido del curso
Automatización, Reutilización y Eficiencia en Consultas
Trabajo con Datos Avanzados (JSON)
- 11

Columnas JSON en MySQL: qué son y cómo modificarlas
Viendo ahora - 12

Índices en columnas JSON con MySQL 8
19:41 min - 13

Uso del Left Join en MySQL para Consultas Avanzadas
26:09 min - 14

Engines y Codificaciones en MySQL: MyISAM vs InnoDB y UTF8MB4
08:13 min - 15

Gestión de Usuarios y Permisos en Bases de Datos MySQL
14:06 min
Gestión Avanzada y Análisis de Bases de Datos
Columnas JSON en MySQL: qué son y cómo modificarlas
Resumen
Las columnas JSON en MySQL combinan la flexibilidad de las bases de datos documentales con el poder de las relacionales. Si trabajas con datos que cambian de estructura entre registros, esta funcionalidad te permite almacenar atributos variables sin romper el esquema de tu tabla.
Esto es útil para desarrolladores backend, administradores de bases de datos y cualquier persona que quiera modelar datos semiestructurados sin migrar a MongoDB o Firebase.
¿Qué es una columna JSON en MySQL y cuándo conviene usarla?
MySQL incorporó el tipo de columna JSON alrededor de 2017, uno de los cambios más grandes en sus más de 20 años de historia. La idea es simple: dentro de una base relacional puedes tener una columna que almacena un documento estructurado, validado y optimizado por el motor.
¿Cuándo usar una columna JSON? Cuando los datos varían entre filas: una camisa tiene talla, una mesa no; un libro tiene autor, una herramienta no. Si el atributo es estable y se repite, va en una columna normal.
La diferencia entre bases relacionales y documentales se cruza aquí. Las bases relacionales como MySQL, Oracle o Postgres trabajan con tablas y relaciones estrictas. Las bases documentales guardan documentos tipo JSON y buscan dentro de su ruta. La columna JSON en MySQL te da lo mejor de los dos mundos, siempre que no abuses de ella [1:30].
¿Puedo guardar decimales con precisión en JSON? No. Para cálculos bancarios o cualquier caso que necesite precisión decimal exacta, usa una columna
DECIMALoDOUBLEdonde tú definas los decimales. JSON varía según versión y configuración.
¿Cómo crear una columna JSON y qué tipos de datos acepta?
La creación es directa. Si quieres añadir una columna data a tu tabla products, ejecutas:
sql ALTER TABLE products ADD COLUMN data JSON AFTER price;
No le pides NOT NULL, solo el tipo JSON. MySQL valida el contenido antes de almacenarlo y lo convierte a un formato optimizado internamente [6:00].
Dentro de una columna JSON puedes guardar varios tipos de valores:
- Objetos llave-valor, como
{"brand": "Pear", "hd_size": "40GB"}. - Listas o arreglos, como
["valor1", "valor2", "valor3"]. - Strings, por ejemplo
"Hola, ¿cómo estás?". - Numéricos enteros y flotantes, con la advertencia de la precisión decimal.
- Booleanos
trueofalse. - El valor
null.
Con estos tipos puedes representar desde el inventario por talla de un producto hasta el historial de medicinas recetadas en los últimos diez años. La clave está en preguntarte si tiene sentido guardar esa información como documento o si pertenece a una tabla relacional [10:30].
¿Cómo insertar un objeto JSON en una fila existente?
Una vez creada la columna, insertas el JSON como un string entre comillas sencillas y MySQL se encarga del resto:
sql UPDATE products SET data = '{"brand": "Pear", "hd_size": "40GB"}' WHERE product_id = 10;
Después, un SELECT * FROM products WHERE product_id = 10 te devuelve el documento ya estructurado.
¿Cómo modificar valores dentro de una columna JSON?
MySQL ofrece tres funciones esenciales para manipular un documento JSON: JSON_REPLACE, JSON_SET y JSON_REMOVE. Las tres comparten una sutileza que conviene entender desde el inicio.
Las tres funciones no modifican la columna directamente. Toman el contenido, hacen la operación en memoria y devuelven un nuevo JSON. Por eso siempre las envuelves dentro de un UPDATE ... SET data = .... Si no guardas el resultado, no pasa nada [13:30].
¿Qué hace JSON_REPLACE y cómo se usa la ruta raíz?
JSON_REPLACE cambia el valor de una llave existente. La sintaxis usa el símbolo de dólar $ como referencia al documento raíz, seguido por la ruta:
sql UPDATE products SET data = JSON_REPLACE(data, '$.brand', 'Banana') WHERE product_id = 10;
El $ representa la raíz del documento. Si la raíz fuera un arreglo ["uno", "dos", "tres"], accedes con $[0], $[1], $[2], o usas $[*] para todos los elementos.
¿Cómo eliminar una llave con JSON_REMOVE?
JSON_REMOVE borra la llave completa del documento. Solo recibe la columna y la ruta:
sql UPDATE products SET data = JSON_REMOVE(data, '$.hd_size') WHERE product_id = 10;
Esto deja el documento sin la propiedad hd_size, no la deja en null, simplemente desaparece.
¿Qué diferencia hay entre JSON_SET y JSON_REPLACE?
JSON_SET agrega una nueva llave si no existe, o la actualiza si ya está. Es la opción más versátil cuando no sabes si el campo ya está presente:
sql UPDATE products SET data = JSON_SET(data, '$.color', 'black') WHERE product_id = 10;
¿Cuándo uso JSON_SET y cuándo JSON_REPLACE? Usa
JSON_SETpara crear o actualizar una llave indistintamente. UsaJSON_REPLACEsolo cuando quieras cambiar un valor que ya existe; si la llave no está, no hace nada.
¿Cómo se ve un documento JSON al consultarlo en MySQL?
Para visualizar mejor un documento, puedes terminar la sentencia con \G en lugar de punto y coma. Esto presenta cada columna en su propia línea y facilita leer estructuras anidadas:
sql SELECT * FROM products WHERE product_id = 10\G
Es un truco que ahorra tiempo cuando trabajas desde la terminal y los JSON empiezan a crecer.
El tipo JSON es válido cuando los datos cambian entre registros, pero si vas a categorizar productos como mueble, ropa o utensilio, eso pertenece a una columna propia o a una tabla relacionada. La marca y la talla, en cambio, son candidatos perfectos para JSON porque no todos los productos las tienen [4:30].
Si vienes del mundo purista relacional, esto puede sonar a herejía. La realidad es que combinar ambos enfoques con criterio te da un sistema más expresivo sin sacrificar integridad. ¿Ya estás usando columnas JSON en tu proyecto? Cuéntame en los comentarios qué tipo de datos guardas ahí.