Mysql türkçe karekter sorunu

Admin

Administrator
Yönetici
Administrator
Katılım
30 Eki 2016
Mesajlar
689
Beğeniler
16
Konum
Zonguldak
#1
Tanımlama:
Biz phpciler için vazgeçilmez biricik veritabanımız Mysql,
hüzünlü bir sonbahar akşama MySQL 4.1.x versiyonunu tüm dünyaya duyurdu.
Burada garip olan bişey yoktu taki “Collation” denen kavramını görene kadar.
İlk gördügümde pek bir gereksiz gelmişti bu “Collation” kavramı bana.Hatta collation = sorunlar zincirinin ilk halkası olacağını daha ilk görüşte hissetmeye başlamıştım...Bu yeni gelen “Collation” olayı Türkçe karakterlerde sorun yaratıyor ve beni çileden çıkartıyordu. O zaman geçici bir çözüm olarak localhost da eski MySQL sürümü kullanarak acılarıma son vermiştim. (O anı kurtarma içgüdüsüydü bu sanırım) Fakat çalıştığım hostlarım çoktan yeni mysql e geçmişti. Artık çağa ayak uydurmanın zamanı gelmişti.

Bu “Collation” kavramı nedir, niye, çıktı nereden geldi başımıza, dertsiz başımıza dert mi katmak istiyor mysql programcıları diye düşünürken “Collation” kavramının mantığını ögrenince, bizim mysql programcı abilerimizin alınlarından öpmek geldi içimden.

MySQL’e “Collation” yapısını ekleyerek daha modern, gelişmiş ve onbinlerce dolarlık maliyeti olan veritabanlarındaki (Oracle gibi) bir standarda kavuşturmuşlardı biz gariban phpcileri; “Collation” olayının gelmesi ile sadece ilgili karakter setini yükleyerek gereksiz karakterlerden kaynaklanan (önceleri bütün dillere özgü karakter setlerini yükleyerek evrensel bir destek sağlıyordu mysql, çince gibi bir dil yapısı destegini bile yüklüyorduk bilgisayarımıza yada hostaki makinamıza ama ne gerek vardı ki, diye düşünüp geliştirmişler yeni “Collation” olayını) ağırlıktan kurtararak sorgu cevap sürelerinde kayda değer derecede azalmalar sağladığını öğrendim.Daha az cpu kullanarak daha hızlı sürede sorgu cevap mekanizmasına “Collation” yapısına geçiş ile kavuşmuş olduk.

Aslında ortada mysql türkçe karekter sorunu diye bir olay yoktur.Sorun bizim veri tabanlarımızı yanlış karakter setinde oluşturmamız ve server ayarlarınında birebir yanlış configürasyonundan kaynaklanmaktaymış.Ben bilgisayarımda appserv kullanırım.Herşeye öncelikle kendi bilgisayarımdaki karekter setinin dogru tanımlanması gerektiğini düşüneren başladım ve c:\windows\ klasöründeki my.ini dosyasını editlemek için kolları sıvadım bu dosyayı açtım:
my.ini dosyasında ki default-character-set=latin1 şeklindeki satırları default-character-set=latin5 yaptım.içimde bir iş yapmanın saadeti ile arkama yaslanıp olayın kefini çıkartmayı düşünürken birden karekterlerin tekrar gümlediğini görünce hevesim yine kursağımda kaldı. Biraz daha kurcalayınca kullandığınız veritabanının dolayısıyla tabloların da ilgili Collation ayarlarının latin5_turkish_ci olması gerektiğini gördüm. Fakat ne yazık ki benim tablolarımdaki field’ların collationları latin1_swedish_ci idi.Mysql Standart olarak swedish geçip işlem yapıyor eger siz özel olarak seçmezseniz. Eger bunu degiştirmezsek bu sütunlara yollayacağınız kayıtlar ise, isveçce dili göz önünde bulundurularak girilir. Bundan çıkan sonuç şu: isveçcede Türkçe karakter yer almaz, bu yüzden Türkçe karakterler yerine ? v.b. karakter çıkıyor. Tablolarımızı oluştururken Türkçe dil grubuna ait yapı olan latin5_turkish_ci şeklinde ayarlamamız gerekiyor. latin5_turkish_ci tablo yapısı ile biz "ISO 8859-9 Latin-1 modification for Turkish (Latin-5) " haline uygun yapıyı seçmiş oluyoruz.
Yeni tablo oluştururken mutlaka charset degerini latin5 olarak yaparak oluşturursak artık karekter sorunu yaşamayız.

PHP:
CREATE TABLE tablo1 ( 
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
deneme VARCHAR(150) 
) CHARSET=latin5;


Eski veritabanları ne yapacak:
Sistem ayarları latin1 olarak ayarlı olan bir makinedesiniz, bu ayarları yapsanız bile bu sefer türkçe karakterlerin yerine sayfanızda soru işaretleri çıkacaktır '?' gibi.Yukarıda anlattığım nedenden dolayı bu makina latin1_swedish_ci ayarlıdır. isveç dilinde türkçe karekterler olmadığından siz verileri girerken, mysql onları anscii yapıda yerleştirmiştir veritabanına.Örnegin siz "öküz" kelimesini veritabanınıza girmişseniz onun hücredeki degeri "&ouml ;k&uuml ;z" şeklindedir.
“Collation” olayının faydasını öküz örneginde daha iyi görüyorsunuz sanırım arkadaşlar.Veritabanından direk Türkçe yazılmış "öküz" kelimesini aramak başka "&ouml ;k&uuml ;z" kelimesi şeklinde aramak başka performans verir.
Bu sorunu çözmek için ise scriptinizde kullandığınız config.php yada baglantıyı yaptığınız kod satırının altına yani
mysql_select_db("$dbname")fonksiyonun altına aşağıdaki kodları eklerseniz sorununuz düzelir.

PHP:
mysql_query("SET NAMES 'latin5'");  
mysql_query("SET CHARACTER SET latin5");  
mysql_query("SET COLLATION_CONNECTION = 'latin5_turkish_ci'");
 

tempobet