MySQL karakter kodu seçimi - utf8 vs utf8mb4

By samed, 18 October, 2015

Yeni bir projeye başlarken özellikle yeni geliştiriciler arasında MySQL veritabanı ve tabloları oluşturma aşamasında karakter kodlama seçiminde kafalar biraz karışık. Bu karışıklıklara bir de rastgele seçilen karakter kodlaması eklenince projenin ilerleyen safhalarında geliştiriciler "Türkçe karakterler bozuk çıkıyor", "MySQL Türkçe karakter problemi", "php Türkçe karakter problemi" başlıklarını Google'da aramaya başlıyor.
 

MySQL'de bir tablo/kolon karakter kodlaması seçimi sırasında aslında iki farklı seçim yaparsınız. Bunlar karakter seti ve karakter sıralama/karşılaştırmasıdır. Seçerken collation yani sıralama seçenekleri seçildiği için ikisinin aynı olduğu yanılgısı oluşabiliyor.

Karakter kodlaması için yaygın tercih utf8'dir. Türkçe karakter problemi yaşamamak için yapılan bu ezbere utf8 seçimi Windows üzerinde geliştirme yapanların yaptıkları dikkatsizlik ile katmerleniyor, yine Türkçe karakter problemi yaşanıyor. Windows üzerinde geliştirme yaparken ürettiğiniz dosyaların ASCII veya Windows-1254 ile kodlanması sorun yaratabiliyor. Geliştirme yaparken dosyalarınızın da utf8 kodlanmış olmasına da dikkat etmeniz gerekiyor.

Karakter seti olarak kullanacağım yere göre değişiklik gösterse de tercihim çoğunlukla utf8'dir. utf8 ile birlikte bir de utf8mb4 diye bir seçenek vardır MySQL karakter kodu listesinde. Bu ikisi arasındaki farklar şu şekilde açıklanabilir.

  • utf8 multibyte bir karakter setidir. Yani utf8 bir karakter her zaman 1 byte uzunluğunda olmayabilir. Örneğin "i" 1 byte'lık bir karakter iken "İ" 2 byte uzunluğundadır.
  • utf8 kodlama seti kendi içerisinde 1 ila 4 byte uzunluğundadır. Yani kullandığınız karaktere göre bu karakterin disk üzerinde kapladığı yer değişkenlik gösterir.
  • MySQL içerisindeki utf8 karakter kodlaması 1 ila 3 byte uzunluğundadır. Yani tam olarak utf8'i MySQL desteklemez. 4 byte uzunluğundaki bir utf8 karakteri utf8 olarak seçilmiş kolona koymaya çalışırsanız MySQL hata verecektir.
  • 4 byte uzunluğundaki karakterler için MySQL sonradan kendi içerisine utf8mb4 karakter kodlama setini eklemiştir. 4 byte uzunluğundaki utf8 karakterleri kullanacaksanız utf8mb4 seçmeniz gerekiyor.

Sıralama seçimi için de kullanacağınız içeriklerin diline göre tercih yapmanızda fayda var. Türkçe içerik barındıracaksanız eğer turkish_ci seçmelisiniz. Yok İngilizce içerik barındıracaksanız general_ci seçebilirsiniz.

https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html

https://en.wikipedia.org/wiki/UTF-8