PHP ve MySQL’de sık yaşanan Türkçe karakter problemleri

PHP ve MySQL’de sık yaşanan Türkçe karakter problemleri

Benim de önceleri sıkça yaşadığım ama sonunda kesin sonuca ulaştığım ve web tasarımla ilgilenen daha doğrusu ilgilenmeye başlayan birçok arkadaşın da sıkca yaşadığı bir problemin kesin ve net çözümünden bahsetmek istiyorum.. Evet problemimiz PHP ve MySQL ile işlem yapan sistemlerde yaşadığımız karakter sorunumuz. Herşeyden önce ben tüm sistemlerinizde evrensel karakter seti olan UTF-8 kodlamasını tavsiye ediyorum. Ve yapacağım tüm işlemleri UTF-8 üzerine anlatacağım.

İsterseniz konumuz olmasa da öncelikle UTF-8 nedir, ne değildir bundan bahsedelim. UTF-8, 8 bitlik bir karakter kodlamasıdır kısaca ve Unicode Transformation Format teriminin kısaltmasıdır. Evrensel bir kodlama formatıdır ve tüm dillerdeki karakterleri kapsar. Bu nedenle UTF-8 kodlamasını kullanmakla evrensel standartlarda bir karakter kodlaması kullanmış oluruz. Unutmayın ki Google da UTF-8 karakter kodlamasını öneriyor. ( SEO’culara duyurulur :D )

Evet şimdi de “Bu karakter kodlamalarını sistemimize nasıl tanıtacağız ki yazdığımız scriptler ve sistemlerde karakter sorunu yaşamayalım?” sorusunun cevabına geçelim yavaş yavaş :)

Herşeyden önce yapmanız gereken kodlarınızı UTF-8 karakter setinde kodlama yapan bir derleyicide yazmak olmalı. Ve karakter kodlamasını BOM olmadan seçeneğiyle yazmak. Bu konuda detaylı bilgiyi yakuter‘in blogundaki UTF-8 BOM (Byte Order Mark) Nedir? yazısında bulabilirsiniz.

Sistemimizi yazmaya başladığımızda ilk yapmamız gereken şey sayfalarımızın HTML karakter yorumlamasını başlık kısmında belirtmek. Bunun için aşağıdaki kodları sayfalarımızın < head > … < /head > kısmına yerleştiriyoruz:


<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Bu işlem sayesinde tarayıcılarımız karakterlerimizi UTF-8 formatında yorumlayacaklardır. Ardından MySQL tablolarımızın tüm karakter kodlamalarını UTF-8 formatına çevirmek için aşağıdaki kodu php ile çalıştırıyoruz:


mysql_query("ALTER DATABASE veritanabi_adı
CHARACTER SET utf8
DEFAULT CHARACTER SET utf8
COLLATE utf8_unicode_ci
DEFAULT COLLATE utf8_unicode_ci
");

veya aşağıdaki kodu phpMyAdmin aracılığıyla SQL sorgusu olarak çalıştırıyoruz:


ALTER DATABASE veritanabi_adı
CHARACTER SET utf8
DEFAULT CHARACTER SET utf8
COLLATE utf8_unicode_ci
DEFAULT COLLATE utf8_unicode_ci
;

Eğer ortada bir veritabanımız yoksa ve yeni bir sistem kuracaksak oluşturduğumuz tüm tablolar ve field’leri utf8_unicode_ci karakter kodlamasında oluşturuyoruz.

Ardından sistemimizde MySQL bağlantı ayarlarını yaptığımız satırların altına aşağıdaki kodu yazıyoruz:


mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET utf8");
mysql_query("SET COLLATION_CONNECTION = 'utf8_unicode_ci'");

Son olarak sayfalarımızın başına aşağıdaki PHP kodunu eklemek eğer sunucu varsayılan karakter seti farklıysa sayfalarımızdaki UTF-8 karakter sorununu çözecektir.


header("Content-Type: text/html; charset=UTF-8");

Eğer tüm sayfalarınızda include ettiğiniz bir dosya varsa (config.php, ayar.php vs.) yukarıdaki kodu sadece o dosyanın başında yazmanız yeterli olacaktır.

Tüm bu işlemleri uyguladıysanız artık karakter problemi diye birşey lügatimizde kalmadı. Tüm işlemlerinizde dilediğiniz gibi Türkçe karakterlere yer verebilirsiniz.

Not: Hala Türkçe karakterlerde sorun yaşıyorsanız muhtmelen server karakter ayarlarını da değiştirmeniz gerekecektir. Eğer server yöneticisi değilseniz bunu hosting firmanızdan isteyin. Yerel sunucunuzda bu problemleri yaşıyorsanız Apache’nin conf dosyasını düzenlemelisiniz.



10 Responsesto “PHP ve MySQL’de sık yaşanan Türkçe karakter problemleri”

  1. Bahadır diyor ki:

    selam,
    yazıdaki gibi alter database komutunu çalıştırdım fakat halen türkçe karakter sorunum devam ediyor.query browser’da bir tabloya türkçe karakter girdiğim zaman hata alıyorum.
    yapılması gereken ek birşey olabilir mi?
    teşekkürler.

  2. Muhittin Özer diyor ki:

    Bu query browser’dan kaynaklanan bir hata da olabilir.
    ALTER DATABASE komutu ile veri tabanının karakter setini değiştiriyoruz. Siz bu komutu uyguladığınızda veri tabanının karakter kodlaması değişiyor mu?

    Eğer veri tabanınızın karakter kodlaması UTF-8′e dönüştü ve diğer belgelerinizde de UTF-8 için gerekli düzenlemeleri yaptıysanız uygulamalarınızda türkçe karakter sorununun ortadan kalkmış olması gerekir.

  3. Mehmet diyor ki:

    Abi süpersin ya en az 15 siteye baktım hiçbiri yemedi bunu yaptım anında çözüm:D

  4. gokhanweb diyor ki:

    unutmayalım bu işlem veritabanının karakter setini değiştirir. kaydedilmiş veriler üzerinde bir değişiklik yapmaz. bu yüzden var olan verilerinizi de utf8 e çevirmeniz gerekir.

  5. Muhittin Özer diyor ki:

    @gokhanweb:
    Evet haklısın, aslında benim önerim projenin baştan bu şekilde kurgulanması gerektiği yönünde.
    Zaten Türkçe karakter hatası varsa mutlaka tüm ayarların aynı karakter kodlamasında olmamasından kaynaklanıyordur ve bu halde de kaydedilmiş verileri düzgün görüntülemek ancak tüm ayarların kaydedilen verilerin karakter koduna uygun olarak değiştirilmesiyle mümkün.

  6. Elmalı diyor ki:

    Merhaba,
    Öncelikle verdiğiniz bilgiler için teşekkür ederiz.

    Peki acaba bu kodlama sistemi ni hiç AJAX da denediniz mi ;)

    Sonuç ne oldu ? Bilgi verirmisiniz….

  7. Muhittin Özer diyor ki:

    Evet, AJAX ile de kullanıyorum sürekli. Hiçbir zaman UTF-8 karakter seti dışında bir kodlama kullanmam ve hiç başım ağrımaz ;)

  8. Fatih Öztürk diyor ki:

    Selam,

    Veritabanındaki türkçe karakter içeren kayıtları sorgularken esnek bir sorgulamayı nasıl yapabileceğimiz konusunda bir önerisi olan var mı acaba?

    Örneğin kullanıcı “çalık” kaydını aramak istiyor Veritabanında bu değer “calık, calik, çalık, çalik” seklinde 4 farkli bir bicimde kayitli olabilir

    Ve kullanici web formunda arama yaparken bu 4 degerden herhangi birini girebilir Kullanici hangisini girerse girsin VT den “calık, calik, çalık, çalik” kayitlarini bulup dondurmemiz gerekiyor.

    Bu durumu MySQL 5.x de nasil cozebilecegimiz konusunda bilgisi olan var mi?

    Benim onerim VT de bir stored function olusturmak ve sorgu atarken bu function i kullanmak. Bu function aldığı string i ASCII ye çevirip yeni halini döndürecek.
    Function’in adi fromTurkishToAscii olsun. Örneğin fromTurkishToAscii(‘çalık’) calıstıgında “calik” döndürcek

    Bu durum yazacağimiz sorgu şöyle olacak:

    SELECT * FROM kisi k WHERE fromTurkishToAscii(k.isim) = fromTurkishToAscii(:kullanicininGirdigiDeger);

    Bundan başka bir önerisi olan var mı? Acaba MySQL’in built-in bir ozelligi var mi bu sorunu kendiliginden cozen?

    Tesekkurler

  9. Erdem diyor ki:

    Çok Teşekkürler Gerçekten İşe Yaradı :)

  10. eta diyor ki:

    bu gerçekten sorunu çözdü ya çok teşekkürler önceden hiç olmuyordu :) :)

Leave a Reply