Turning gears are the logo of co-scripts

İnternette farklı nedenlerden kaynaklanan farklı Türkçe karakter görüntüleme sorunlarına rastlamışızdır. Benim de başıma pek çok defa nedenleri farklı sorunlar geldi. Her seferinde konuyu da tam anlamadan çözümler ürettim. Ancak sıfırdan mysql ve php ile bir uygulama hazırlayacaksanız, özellikle Türkçe karakter desteği gerekiyor ise önce şu sayfadaki temel bilgileri okumanızı öneririm. Buradaki bilgiler yeterli gelmezse aynı sayfada bahsedilen kavramları google'dan arayarak detaya inebilirsiniz.

Olayda 2 temel müdahil var. Birisi sunucu (MySQL) diğeri browserımız. Elimizdeki veriyi sunucuya gönderdiğimizde istediğimiz şekilde kaydedilmesi için gereken ile talep ettiğimizde sunucunun bize istediğimiz şekilde vermesi kısmı sunucu ayarları ile ilgili. 

Sunucudan istenilen formatta gelen verinin browser'da istenildiği gibi görünmesi ise html meta taglarımızla alakalı. Ancak bilmekte fayda var, sunucu verisi ana kriter. Yani sunucudan istenilmeyen formatta gelen veriyi browser istenilen formatta gösteremez.

Şimdi utf8 kabaca çok fazla dile destek veren bir karakter setleri koleksiyonu1. Ancak bazı dillere özel karakterlerin eklendiği (ve dile özgün çeşitlendirildiği, çevirimler içeren) sunumları var.Dilimize özgü bir sayfa hazırlayacaksak,yine de, utf8_unicode ve utf8_general'dan farklı olarak dilimize özgü utf8_turkish_ci setini kullanmalıyız. 

Karakter setine karar verdikten sonra, veri tabanının karşılaştırma setini (Genel Ayarlar-Sunucu bağlantısı karşılaştırması) utf8_turkish_ci olarak seçiyoruz. Tablomuzu oluştururken/oluşturduktan sonra (henüz boşken) İşlemler>Karşılaştırma seçeneğinden yine utf8_turkish_ci seçildiğini kontrol edelim.

Bundan sonra tablolarda metin tipi değişkenlerde mutlaka "karşılaştırma" kısmında utf8_turkish_ci olduğunu teyit ederek gidelim.

Tüm bunlar sunucunun metin tipi verileri alırken,saklarken,verirken utf8_turkish_ci kullanacağını, farklı bir karakter gelirse bile bu setteki karşılıklarına çevireceğini gösterir.

Sunucuyu bu şekilde sağlama alınca istemciye gitmeden önce php tarafında yapılacak tek şey var (başkaca çözümleri olsa da), pek çok fonksiyon ve 3-4 satırdan oluşan PDO komut grubunun dışında, PDO bağlantı tümcesine tek bir değişken eklemek yeterli oluyor. Bu hem veriyi sunucuya verirken hem de sunucudan veri çekerken işleri yoluna koyacaktır.

Örneğin:

	$db = new PDO('mysql:host=localhost;dbname='.$vtAdi.';charset=UTF-8', $vtKullaniciAdi, $vtParolasi,[PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"]);

 

Eklenen son parametre: [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"] php ayağını da sağlama alır.

Daha sonra herkesin bildiği meta tagı html içine koyduğunuzda (veya css ile ilgili @ eklendiğinde) herşey tam olarak TR karakterlerde hem okunur hem yazılır. Üstelik phpMyAdmin içinde de karakterler doğru görünür ve istediğiniz gibi manuel TR giriş yapsanız da bozulma olmaz.

TR karakter sorununa başka bir şekilde de rastlayacağımız kesin, çünkü halâ bilgi eksiğimiz var ve devşirme çözümlerle devam ediyoruz. Kolay gelsin...

co-scripts tag image turkce karakter sorunuutf8utf8_turkish_cimysql turkce karakter problemipdomysql_attr_init_commandset namesphp
ID:270 | Okunma:2506


 

güzel güzel uygulama yazarken bir anda MySQL "Ş" harfinde başlıktaki hatayı verdi (Incorrect string value). Arkasından karakterin utf8 encode edilmiş hali. Sayfaya post edilen veriyi kontrol ettiğimde normal gözükmesine rağmen INSERT cümlesinde hata bir türlü gitmiyordu.

Aramalarım sonucunda tablo motorunun (Table Engine) MyISAM ve InnoDB arasında bazı farklar olduğunu ayrıca Default collation ve Convert to Charset değerlerinin de doğru olmadığını gördüm. Nedense Latin_1 general ci kullanılıyormuş :/

Default Collation: utf-8 turkish ci

Convert to Charset: utf-8

yaptığımda tüm metin script dosyalarımda utf8 olduğundan  sorun misler gibi çözüldü.

MyIsam ve InnoDB arasındaki farklara şuradan  ve şuradan bakabilirsiniz, sorunu 2007'den bu yana yaşayanların yazdıkları da şurada var. En temel fark veri işlenmesi sıradında InnoDB2nin satır kilitlemesi, MyISAM'ın ise tablo kilitlemesi gibi görünüyor. Veri sunuş hızı MyISAM'da bir nebze önde. Ayrıca yedeklenmeleri sırasında da MyISAM üstünlüğü var gibi. Diğer motorlarla ilgili bilgi aramadım ama genellikle MyISAM övülüyor. Ancak sitedeki ankette InnoDB öndeydi ;)

Ben MyISAM kullanıyorum.

co-scripts tag image incorrect-string-valuemysql-utf8-kayit-sorunumyisam-vs-innodbutf8trukce-karakter-problemi
ID:229 | Okunma:3331


 

Merhaba,

Başka bir Türkçe karakter sorunu yazısında tekrar birlikteyiz. Çok itici bir giriş oldu belki ama farklı platform ve araçlarla çalışanların sürekli başına gelen bir problem. Ve bu problem başladığında projenin geri kalanının anlamı kalmıyor ;)

Hala çok az bilgim olan bir konuda size 2-3 ipucu vereceğim. Karakter verisi iki şekilde görünür, birincisi hafızada yer aldığı formu, diğeri kullanıcının arayüzünde sergilendiği formu. Veri tabanları bizim görmek istediğimiz formatta tutmak zorunda değillerdir. yine de veri kaybına uğramamaları için olası görüntülenecekleri dilin verileriyle saklanmaları temel limittir. 

Başıma gelen olayda MSSQL sunucu da tutulan metin bazlı verilerin nvarchar tipinde olması gerektiğini önceden öğrenmiştim. Bazen ntext yada char sorun çıkartabiliyordu. Hala bunların neden böyle olmaları gerektiğini kesin olarak bilmiyorum.

Veriyi mssql ve mysql gibi sql sunucular Collation isminde bir tip özelliğiyle (dil kodu) birlikte saklıyor ve sunuyorlar. Şuradan detaylı temel bilgiler alınabilir. Collation tablosu (listesi) burada görülebilir. Garip bir çeviri ile MS'in yazısı burada, SQL ile collation desteğini çevirebilmek için güzel bir trick örneğini buradan görebilirsiniz.

Gelelim ASPUpload'un konuyla ilişkisine. Bildiğimiz gibi veritabanına kayıt yapan .asp sayfamızın kodlamasına eskiden hiç dikkat etmezdik.

Ancak Türkçe Collation kullanan bir tablomuz varsa (MSSQL de) ve bir upload formu kullanarak metin verisi de gönderiyorsak üstelik sayfamız utf8 ile kodlanmışsa ASP içinden session, codepage,response metodları çok kar etmiyor.

Türkçe dil sorunlarını görüntüleme kısmında yani kullanıcı tarafında nasıl çözüldüğünü şu yazıda belirtmiştik. Ancak upload formunun getirdiği multipart verisinin metin kısmı için utf-8 kodlu sayfalarda mssql'e karakter bozulması olmadan girebilmesi için Set Upload = Server.CreateObject("Persits.Upload") kodu ile oluşturulan upload nesnesine ait CodePage kullanılmak zorunda. Hemen alt satıra şunları yazarak bu işi çözmüş oluyoruz.

Upload.CodePage = 65001 kaynak

Detaylı bilgiyi üstte verdiğim kaynaktan alabilirsiniz.

En başta bana sonra başkasına yardımı dokunur diye bu kodları bir yerlerde toplama ihtiyacımdan meydana gelen bu sitedeki yazılardaki amatörlüklerin hoş görülmesi dileğimle.

co-scripts tag image aspuploadmssql karakter sorunuutf8upload.codepagecodepageunicode
ID:223 | Okunma:3931