MySQL 4.1.x & 5.x Turkce Karakter Sorununun Cozumu

Merhaba ,

Bu makalede bir cok arkadaşımızın resmen işkence yaşadığı mysql 4.1.x surumu ve turkce karakterlerin sorunsuz, duzgun şekilde goruntulenebilmesi icin nasıl ayarlanacağını anlatacağım.

İlk once calışmaya başlamadan once: http://dev.mysql.com/downloads adresinden MySQL 4.1.x serisinin son surumunu download ediyoruz.

Konumuz turkce karakterler olduğu icin mysql'nin kurulumunu anlatmıyorum.

Soze başlamak gerekirse, oncelikle MySQL 4.1.x surumunde turkce karakter problemi baştan beri yoktur, problemin asıl kaynağı bizim veri tabanlarımızı yanlış karakter setinde oluşturmamız ve server ayarlarınında birebir yanlış configurasyonundan kaynaklanmaktadır.

MySQL 4.1.x serisi ile birlikte yeni bir ozellik olarak gelen, karakter setleri (charset) ve buna eşit karşılaştırma setleri (collation), ozellikle daha onceki 4.0.x ve 3.0x serilerindeki sıralama ve arama sorgularındaki yaşanan problemi tamamen ortadan kaldırıyor.

MySQL 4.1.x serisinde turkce karakterler icin 2 ayrı karşılaştırma seceneği bulunmaktadır.

Bunlar;

latin5_bin (buyuk, kucuk harf duyarlı)
latin5_turkish_ci (buyuk, kucuk harf duyarsız)
karşılaştırmalarıdır, bizim tercihimiz herzaman latin5_turkish_ci karşılaştırması olmalıdır. Bu karşılaştırma sayfalarda ISO-8859-9 setine denk gelmektedir.

MySQL'de latin5 karakter seti, varsayılan karşılaştırma olarak latin5_turkish_ci karşılaştırmasını kullanıyor, tabloları yada veri tabanlarını oluştururken bunu ekstradan girmenize gerek yok ancak girmenizin zarardan cok faydası olacaktır.

Tablolarınızı oluştururken herzaman aşağıdaki gibi oluşturun, mesela latin5 karakter seti ve karşılaştırma latin5_turkish_ci icin en doğru tablo oluşturmasını yapalım:

Kod:
CREATE TABLE tablo1 ( id INT NOT lisanssız AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) ) CHARSET=latin5;

Bu tabloda karşılaştırma seceneği girilmediği icin varsayılan karşılaştırma; latin5_turkish_ci kullanır.

Şimdide latin5_bin karşılaştırması icin doğru bir tablo oluşturalım;

Kod:
CREATE TABLE tablo1 ( id INT NOT lisanssız AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) ) CHARSET=latin5 COLLATE=latin5_bin;

Bu tabloda COLLATE girdiğimiz icin karşılaştırma değeri olarak latin5_bin değerini kullanacaktır.

En onemli kısım veri tabanı oluşturmada bitiyor.. eğer yukarıdaki sabit ayarlarla bundan sonraki oluşturulacak butun tabloları latin5 ve karşılaştırması: latin5_turkish_ci tanımlamasını otomatik olarak kullanmasını sağlamak icin, veri tabanını aşağıdaki gibi oluşturuyoruz (latin5_turkish_ci icin ornek);

Kod:
CREATE DATABASE veritabanıadı CHARSET=latin5;

bu komutla veri tabanımızı oluşturduğumuzda, karşılaştırma değeri otomatik olarak latin5_turkish_ci kullanılacaktır.

Eğer tablolarda latin5_bin karşılaştırmasını kullanmak istiyorsak, onu ayrıca veri tabanını oluştururken tanımlıyoruz;

Kod:
CREATE DATABASE veritabanıadı CHARSET=latin5 COLLATE=latin5_bin;

Ancak sistem ayarları latin1 olarak ayarlı olan bir makinede, bu ayarları yapsanız bile bu sefer turkce karakterlerin yerine sayfanızda soru işaretleri cıkacaktır '?' gibi.

Bununda cozumu cok basit, mysql bağlantısı yaptığınız sorgu koduna aşağıdaki eklentiyi yapmanız yeterli;

mysql_query("SET NAMES 'latin5'");

Boylece bağlantı yapılacak istemcinin karakter seti latin5 olarak tanımlanır ve karakterler doğru goruntulenir.

Yurtdışından hosting hizmeti alanlar, mysql karakter seti ayarları latin1 yada utf8 olan sunucularda, hosting hesabındaki mysql turkce karakter seti ayarlarının doğru yapılandırılması:

not: bu işlemler sadece yeni oluşturulacak veritabanları ve tablolar icindir.

Farklı nedenlerden dolayı hosting hizmeti icin yurtdışındaki firmaları tercih edebiliriz, bu firmalardaki serverların mysql karakter seti yapılandırmaları genellikle latin1 yada utf8 dir. Bu iki karakter seti turkce karakterler icin yanlış bir yapılandırmadır. Bu sebeple doğru yapılandırma ve turkce karakterlerin hem sorunsuz hemde gelecekte benzer problemler yaşamamak icin yurtdışından hosting hizmeti alan arkadaşlar aşağıdaki adımları takip etsinler:

Varsayılan olarak latin1 veritabanı karakter seti, karşılaştırması latin1_turkish_ci olarak ayarlanmış serverlar icin, turkce karakterlerin sorunsuz calışabilmesi icin, oncelikle panel kullanıyorsak cpanel,plesk yada benzeri paneller olur, herzamanki gibi veritabanımızı oluşturuyoruz.

Eğer veritabanı latin1 olarak oluşturuluyorsa, aşağıdaki sorgu kodunu phpmyadmin uzerinde calıştırıp, oluşturduğumuz veritabanını utf8'e vede karşılaştırmasını utf8_turkish_ci olarak ayarlıyoruz:
ALTER DATABASE `veritabanı-adı` DEFAULT CHARACTER SET utf8 COLLATE utf8_turkish_ci
Genişletmek icin tıkla ...

sorguyu girdikten sonra phpmyadmin data kısmına baktığınızda latin1 olarak oluşturulan veritabanının, utf8'e donuştuğunu goreceksiniz. Tablolarınızı oluşturmaya başladığınızda ise karşılaştırmaların utf8_turkish_ci olarak ayarlandığını goreceksiniz, bu sebeple turkce karakterler sorunsuz olarak bu veritabanında calışacaktır. Tabiki sayfalarınızda charset UTF-8 olarak eklemeyi unutmayın.

Eğer varsayılan olarak mysql karakter seti utf8 vede karşılaştırması utf8_general_ci olarak ayarlanmış ise, istersek yukadaki sorgudaki gibi karşılaştırmayı utf8_turkish_ci olarak kullanabiliriz, turkce karakterler sorunsuz calışacaktır. İsteğe bağlı olarak aşağıdaki komutla veritabanını latin5 ve karşılaştırmasıda latin5_turkish_ci olarak ayarlayabiliriz:

ALTER DATABASE `veritabanı-adı` DEFAULT CHARACTER SET latin5 COLLATE latin5_turkish_ci
Genişletmek icin tıkla ...

sorguyu calıştırdıktan sonra veritabanının latin5'e donuştuğunu goreceksiniz. Tablolarınızı oluşturduğunuzda ise karşılaştırmaların latin5_turkish_ci olarak ayarlandığını goreceksiniz. Bu şekilde kullandığınızda sayfalarınızda iso-8859-9 kullanmayı unutmayın.

Bir konuyu acıklığa kavuşturmak gerekirse; mysql karakter seti ayarları latin1 olarak ayarlanmış bir sunucuda veritabanı ve tablolarda latin5 kullandığımızda turkce karakterlerin yerine soru işaretleri cıkacaktır ornek: => ?