Tipe data JSON di MySQL 8 untuk data fleksibel
Simpan dan query data JSON secara native tanpa mengubahnya jadi teks biasa.
Kolom JSON native di MySQL
Sejak versi 5.7, MySQL memiliki tipe kolom JSON yang tervalidasi otomatis dan tersimpan dalam format biner internal, sehingga lebih efisien dibanding menyimpan JSON sebagai teks.
CREATE TABLE preferensi (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
pengguna_id BIGINT UNSIGNED NOT NULL,
pengaturan JSON NOT NULL
);
INSERT INTO preferensi (pengguna_id, pengaturan)
VALUES (1, '{"tema": "gelap", "bahasa": "id"}');
Mengambil nilai dari kolom JSON
SELECT
pengguna_id,
pengaturan->>'$.tema' AS tema
FROM preferensi
WHERE pengaturan->>'$.bahasa' = 'id';
Operator ->> mengambil nilai dan langsung mengubahnya menjadi teks, sehingga bisa langsung dibandingkan dengan string biasa.
Generated column untuk mempercepat pencarian
ALTER TABLE preferensi
ADD COLUMN tema VARCHAR(20)
GENERATED ALWAYS AS (pengaturan->>'$.tema') STORED,
ADD INDEX idx_preferensi_tema (tema);
Generated column menyalin nilai dari JSON ke kolom biasa yang bisa diindeks, karena indeks langsung pada ekspresi JSON tidak selalu didukung secara efisien di semua versi MySQL.
Validasi struktur di sisi database
ALTER TABLE preferensi
ADD CONSTRAINT chk_pengaturan
CHECK (JSON_VALID(pengaturan));
Meski kolom bertipe JSON otomatis tervalidasi, constraint tambahan berguna jika Anda membatasi struktur tertentu yang wajib ada.
Latihan
Tambahkan generated column baru untuk field bahasa, lalu buat indeks gabungan antara tema dan bahasa.
