MySQL’de JSON Verileriyle Çalışmak

Bu yazımda sizlere mysql’de json olarak depoladığımız veriler üzerinde listeleme, arama, düzenleme gibi işlemler nasıl yapılır bunlardan bahsetmek istiyorum. Eğer JSON ile uğraşıyorken aklınıza NoSQL veritabanları geliyorsa haklısınız, ancak mysql’de de bir takım işlemler yapabildiğimizi unutmamak lazım 🙂

Öncelikle neden JSON olarak veri depolarız? Ben kendi adıma konuşacak olursam, örneğin seo bilgilerini json formatında tutuyorum. Yani title, description, keywords ama yarın öbürgün ekstra bir bilgi daha ekleyebilirim örneğin noindex, canonical vb. Bunun için sürekli gidip kolon oluşturmak tamamen saçmalık olurdu. Bu yüzden tüm bu değerleri tek bir kolon altında json formatında tutuyorum. Ve yeri geldiğinde bunları filtrelemek, bunlar içinde arama yapmak gerekirse değiştirmek, listelerken ayrı ayrı göstermek isteyebilirim.

İşte bu noktada mysql’de bazı fonksiyonlar bize yardım edecek. Alışılmışın dışında bir sorgu yazıyormuşuz gibi görünsede, aslında ne kadar kolay olduklarını birazdan anlayacaksınız 🙂

JSON Veri Eklemek

Biz aslında PHP tarafında json_encode() fonksiyonu ile dizileri ya da objeleri json haline getirerek ekleyebiliyoruz. Örnek vermek gerekirse;

<?php

$arr = [
    'title' => 'Erbilen.net',
    'description' => 'Tayfun Erbilen\'in Bloğu'
];

echo json_encode($arr);
// Çıktı: {"title": "Erbilen.net", "description": "Tayfun Erbilen'in Bloğu"}

PHP’de json ile ilgili işlemlerin daha fazlası için şu yazıma gözatabilirsiniz. MySQL tarafında elle json veri eklemek istersek;

INSERT INTO tablo_adi
SET kolon_adi = '{"title": "Erbilen.net", "description": "Tayfun Erbilen\'in Bloğu"}'

Gördüğünüz gibi çok ekstra bir şeyi yok. JSON ekleme aynı zamanda şu fonksiyonlar ile de olabilir;

JSON_ARRAY

Bu fonksiyon geriye array döndürecektir. Kullanımı ise;

INSERT INTO tablo_adi
SET kolon_adi = JSON_ARRAY('tayfun','erbilen');
#    ['tayfun','erbilen']

JSON_OBJECT

Bu fonksiyon geriye obje döndürecektir. Kullanımı ise;

INSERT INTO tablo_adi
SET kolon_adi = JSON_OBJECT('ad','erbilen','soyad','erbilen');
#    {"ad": "erbilen", "soyad": "erbilen"}<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">​</span>

JSON_MERGE

Bu fonksiyon array ve objeleri birleştirecektir. Kullanımı ise;

INSERT INTO tablo_adi
SET kolon_adi = JSON_MERGE('{"ad":"tayfun"}','{"soyad":"erbilen"}', '[1,2,3]');
#   [{"ad": "tayfun", "soyad": "erbilen"}, 1, 2, 3]

JSON_TYPE ve JSON_VALID

Bu iki fonksiyon json formatının doğruluğunu kontrol eder. JSON_TYPE’da geriye ARRAY, OBJECT ya da hata mesajı döner. JSON_VALID’de ise format doğru ise 1 değil ise 0 döner. Kullanımı ise;

-- dönen değer ARRAY:
SELECT JSON_TYPE('[5, 7, "erbilen.net"]');

-- dönen değer OBJECT:
SELECT JSON_TYPE('{"ad": "tayfun", "soyad": "erbilen"}');

-- dönen değer hata mesajı:
SELECT JSON_TYPE('{"ad": "tayfun", "soyad": "erbilen"');

-- dönen değer 1:
SELECT JSON_VALID('[5, 7, "erbilen.net"]');

-- dönen değer 1:
SELECT JSON_VALID('{"ad": "tayfun", "soyad": "erbilen"}');

-- dönen değer 0:
SELECT JSON_VALID('{"ad": "tayfun", "soyad": "erbilen"');

JSON içinde Arama

JSON verileri depoladıktan sonra önemli olan onlar içerisinde belli bir düzende arama yapıp onları listelemektir. Bunun için birkaç yararlı fonksiyonu inceleyeceğiz;

JSON_CONTAINS()

Bu fonksiyon ile JSON içerisinde istediğimiz şeyin olup olmadığını kontrol ediyoruz. Örneğin array’de bir değer ya da obje’de bir key value gibi. Hemen örneklendirelim;

# kolon_adi = {"ad":"tayfun","soyad":"erbilen"}
SELECT * FROM tablo_adi
WHERE JSON_CONTAINS(kolon_adi, '{"soyad": "erbilen"}');

Yukarıdaki örnekte kolon_adi kolonunda depolanan json değerler içerisinde soyad objesi olup değeri erbilen’e eşit olanlar listelenecektir.

SELECT * FROM tablo_adi
WHERE JSON_CONTAINS(kolon_adi, '[2]');

Yukarıdaki örnekte ise kolon_adi kolonunda depolanan array içerisinde 2 değeri olanlar listelenecektir.

JSON_SEARCH()

Bu fonksiyon ile JSON olarak depoladığımız değerlerin path’leri bulmanızı sağlıyor. İlk parametresi JSON değeri, ikinci parametresi ise all ya da one olarak belirlenmeli. all derseniz eğer aradığınız değer birden fazla ise hepsini döndürür one derseniz sadece ilkini döndürür. 3. parametre ise aradığınız değer olarak belirlenmeli. Örneğin;

SELECT JSON_SEARCH(kolon_adi, 'all', 'soyad') FROM tablo_adi
# Örnek çıktı:   ["$[0]", "$[1].deneme"]

JSON_EXTRACT()

Bu fonksiyon ile json pathlerini belirleyerek işlem yapabiliyoruz. Örneğin json veri içerisinde soyad’a sahip olanları listelemek istersek;

SELECT * FROM test_tablo
WHERE JSON_EXTRACT(test_kolon, '$.soyad')

Bu örnekte test_kolon içerisinde aşağıdaki gibi bir json saklandığını farz ediyoruz.

{"ad": "tyfn", "soyad": "erbilen"}

Kısaca aşağıdaki JSON verisini baz alırsak;

{
  "a": 1,
  "b": 2,
  "c": [3, 4],
  "d": {
    "e": 5,
    "f": 6
  }
}

O halde JSON_EXTRACT() içerisinde path’leri şu mantıkta kullanabiliriz;

$.a – 1 döndürür
$.c – [3,4] döndürür
$.c[0] – 3 döndürür
$.d.e – 5 döndürür
$**.e – 5 döndürür

Sorgularda JSON Yollarını Almak

JSON Path’leri herhangi bir fonksiyon yardımı olmadan da sorgularda kullanabiliriz. Bunun için tablo_adi->’$.path’ şeklinde bir kullanım söz konusu. Yukarıdaki kullanım şekillerini baz alabilirsiniz.

SELECT kolon_adi->'$.ad' as ad FROM tablo_adi;
# ya da
SELECT * FROM tabo_adi
WHERE kolon_adi->'$.ad' = 'tayfun';

JSON Verilerini Düzenleme

Bu işlem için birkaç fonksiyon var.

JSON_REPLACE()

İlk parametresi json verisi, 2. parametresi path yani yolu, 3. parametresi ise yeni değeri. Daha sonrasında path, value, path, value şeklinde devam ederek kullanılabilir.

UPDATE tablo_adi
SET kolon_adi = JSON_REPLACE(kolon_adi, '$.uye.ad', 'Tayfun')

JSON_SET()

JSON_REPLACE ile aynıdır. Kullanımlarıda aynı şekildedir.

JSON_INSERT()

JSON verisine yeni değerler eklemek için kullanılıyor. Örneğin;

UPDATE tablo_adi
SET kolon_adi = JSON_INSERT(kolon_adi, '$.adsoyad', 'Tayfun Erbilen')
WHERE id = 2

JSON_REMOVE()

JSON verisinden değer silmek için kullanılıyor. Örneğin;

UPDATE tablo_adi
SET kolon_adi = JSON_REMOVE(kolon_adi, '$.adsoyad')
WHERE id = 2

Bu makalemizde buraya kadardı 🙂

Eğer daha fazla merak ettiyseniz mysql’in kendi döküman sayfasından devamını inceleyebilirsiniz.

Bkz: https://dev.mysql.com/doc/refman/en/json-functions.html

Yayınlayan

Tayfun Erbilen

2009'dan beri web işleriyle uğraşan, aynı zamanda amatör müziklede ilgilenen sıradan birisi..

“MySQL’de JSON Verileriyle Çalışmak” üzerine 6 yorum

  1. Bilgilendirme için teşekkür ederim. Mysql LIKE ile arasındaki performansı ölçme şansın oldu mu? Hangisi daha performanslı diye.

  2. Eline sağlık, iyi bir yazı olmuş. Bir ekleme daha yapayım: MySQL’de JSON kullanacaksanız MySQL sürümünün 5.7 ve üzeri olması gerekiyor. Şu anda 5.6 çoğunlukla kullanılan sürümdür. (Artık güncellemek gerekiyor mu, evet)

  3. performanstan ziyade, like ile yapamayacağınız şeyleri yapabiliyorsunuz 🙂 o yüzden ikisinin performansını ölçsekte bazı durumlarda bu arkadaşları kullanmak zorunda kalabiliriz.

  4. $query = $db->prepare(“INSERT INTO dene SET abc = JSON_ARRAY(‘tayfun’,’erbilen’)”);

    php ile kayıt olmuyor hatada vermiyor nasıl php’den kayıt yapabilirim.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir