MySQL'de UTF8 karakter seti ve Türkçe kuralı

 
MySQL  
964  

Merhaba arkadaşlar.

MySQL veritabanını çoğumuz UTF8 karakter setinde tablolar oluşturarak kullanmışızdır. UTF8 unicode olduğundan sadece Türkçe değil diğer dillerdeki özel karakterleri de destekliyor. Latin 5 karakter setinde Türkçe karakterleri desteklendiğini biliyoruz fakat UTF8 gibi diğer dillerdeki bütün karakterleri de gösteremiyor maalesef.

Ben bu yazımda UTF8 karakter seti kullanıp MySQL'in bizim Türkçe kurallarını uygulamasını nasıl sağlayabiliriz bunu anlatacağım.

Birkaç örnek ile buna neden ihtiyaç duyduğumuzu anlayalım.

1) Küçük-büyük harf işlemleri: Bildiğiniz gibi İngilizcede i harfinin büyüğü I dır. Türkçede bu durum biraz daha farklıdır. Şöyle ki i harfinin büyüğü I değil İ dir, I ise ı harfinin büyüğüdür. Zaten İngilicede ı ve İ harfleri yoktur. İşte bu noktada sorunumuz şu ki, MySQL bunu ayırt edemeyecektir. Bizim ona bunu anlatmamız gerekir.

Örnek: İsmail Işık isimli birinin ismini LOWER fonksiyonu ile küçültmeye çalışırsak sonuç "İsmail işik" olacaktır. İsmail'in İ'si hala büyük ve Işık'ın I sı küçük i olmuş. Bu hatalı bir sonuç.

2) A'dan Z'ye sıralama işlemleri: ORDER BY gibi sıralama yaptığımızda yine Türkçe alfabesine göre sıralama değilde İngilizce alfabesine göre sıralama yapacaktır. 

İngilizce Alfabesi: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z.

Türkçe Alfabesi: A B C Ç D E F G Ğ H I İ J K L M N O Ö P R S Ş T U Ü V Y Z.

Normalde sıralamayı şu şekilde kullanırız:

sql kodu:SELECT * FROM insanlar ORDER BY isim ASC

Fakat burada Türkçe karakterlere uygun bir sıralama olmayacaktır.

Şu şekilde yaptığımızda sorunumuz düzelecektir:

sql kodu:SELECT * FROM insanlar ORDER BY isim COLLATE utf8_turkish_ci ASC

Yukarıdaki gibi COLLATE utf8_turkish_ci kullanarak Türkçe alfabesine uygun sıralama elde etmiş oluruz.

Örnek: Osman, Zafer, Ali, Veli, İsmail gibi isimler olduğunu varsayalım. ORDER BY isim ASC dediğimizde sonuç şu olacaktır:

Ali
Osman
Veli
Zafer
İsmail

Türkçe'de normalde Ali, İsmail, Osman... şeklinde olması gerekirken İsmail en sonda yer aldı. Çünkü MySQL Türkçe dili kurallarını kullandığımızın hala farkında değil.

Peki bu sorunları nasıl çözebiliriz?

Çözümü çok basit, sadece şu kod parçasını kullanmak:

SET NAMES 'utf8' COLLATE 'utf8_turkish_ci';

Örnek:

sql kodu:SET NAMES 'utf8' COLLATE 'utf8_turkish_ci';
SELECT LOWER("İSMAİL IŞIK");

Çıktı: ismail ışık