MySQL 5.7 made the JSON column real

Storing JSON in a TEXT column has always worked and gives you nothing: no validation, no way to query inside it, and a full parse in the application for every read. 5.7 added a native type that validates on write and stores a parsed binary form.

ALTER TABLE events ADD COLUMN payload JSON;

INSERT INTO events (payload) VALUES ('{"customer_id": 91}');
INSERT INTO events (payload) VALUES ('{not json');   -- rejected

SELECT payload->>'$.customer_id' FROM events;

The ->> operator extracts and unquotes; -> extracts and leaves it as JSON, which is the difference between 91 and "91". What it is not is a reason to stop designing schemas — a field you query or join on belongs in a column. It earns its place for genuinely variable payloads, such as a webhook body or an audit record, where the shape differs per row.