Mysql türkçe karekter sorunu

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

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.

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

PHP ile MySQL birlikte kullanmak 2

Temel PHP Veritabanı Yönetim Sistemi (DBMS):

Bir veri tabanı yönetim sistemi gibi PHPMyAdmin gibi bir sistem veritabanı kontrol etmenizi sağlar. Birçok kez, her bir değişim için web tasarımcısı aramak zorunda kalmadan kendi web sayfasında unsurları kontrol etmek isteyen bir müşteri için basit bir DBMS olması güzel. Aksine onları tüm PHPMyAdmin erişim sağlayarak daha temel bir DBMS kullanılabilir. Burada indirmek ve kullanmak bir fonksiyonel, basit bir PHP DBMS. Basitçe, kaynak kodunu görüntülemek üstündeki değişkenleri değiştirmek ve web sunucunuza yükleyin. Birisi sayfa boyunca yanılmak ve veritabanı düzenlemek için mümkün değildir bu nedenle etrafında bir güvenlik bit komut dosyası koyarak öneririz. Teknik olarak, tek bir tablo düzenlemeleri gibi sadece bir tablo yönetim sistemi ancak dosyayı çoğaltmak ve veritabanındaki her tablo için kullanabilirsiniz. Bu aynı zamanda bir İçerik Yönetim Sistemi (CMS) denir.

Web Sayfası MySQL Veri gösterimi:

MySQL veritabanı Veri gösteriliyor tabii ki bizim istediğimiz sonuç. Aşağıda, birden fazla satır ya da tek bir satır göstermek için iki farklı ama benzer işlevleri vardır. Bir öğe gösteren tek bir satır veya giriş olacağını ise birden fazla satır gösterilen öğeleri veya girişlerin bir listesini gösterir. Bu yöntem kullanılabilir ve internet üzerinden sonsuz şekillerde kullanılır.

Çalışmak ya da bu işlevler için bunu bir MySQL veritabanı ve tablo satırları ile kurulum ve kullanıcı bilgileri bilmek gerekir.

MySQL veritabanı için uygun bağlantı kurulması, iki fonksiyonları için gereklidir.Ilk bağlantı, kullanıcı kimlik doğrulaması altında MySQL web sayfa bağlantıları PHP fonksiyon mysql_connect kullanılarak yapılır. Sonraki veritabanı, bu bağlantı için etkin bir veritabanı ayarlar PHP işlevi mysql_select_db kullanılarak yapılır soran olacak tablo tuttuğu seçilir.

<?
$databasename='database_name'; // veritabanı adı
$tablename='table_name'; // tablo adı
$mysqladd='localhost'; // MySQL Server adresi- genelde localhost dur veya Sunucu IP adresi olur
$mysqluser='MySQL_username'; // Sizin MySQL kullanıcı adınız
$mysqlpass='MySQL_password'; // Sizin MySQL Şifreniz

//MYSQL BAĞLANTISI
$link=mysql_connect($mysqladd,$mysqluser,$mysqlpass) or die('Database Error: ' . mysql_error());

//VERİTABANI BAĞLANTISI
mysql_select_db($databasename, $link) or die('Could not connect to table: ' . mysql_error());
?>

Sonraki veritabanı ve MySQL $ sonuç $ sonuçları dizi yapı sorgulama. Aşağıda, bu hatları inşa yapıldı mysql_query row (s) içeren bir dizi sonuç olarak adlandırılır.

Olası Yöntem 1 Çoklu Sonuçlar:
Bu tablodan tüm satırları ve alanları dönecektir. PHP dosyasını buradan indirin.

<?
$results=array();
$sql="SELECT * FROM `".$tablename."`";
$result = mysql_query($sql, $link) or die('Error: ' . mysql_error());
while($a_row = mysql_fetch_array($result, MYSQL_ASSOC)) array_push($results, $a_row);
?>

Yöntem 2 Tek Sonuç:

Http://www.mydomain.com/single.php?id=5:  gibi bir URL kullanmak istiyorsunuz. PHP dosyasını buradan indirin.

<?
$results=array();
$sql="SELECT * FROM `".$tablename."` WHERE `id`=".$_REQUEST[id]." LIMIT 1";
$result = mysql_query($sql, $link) or die('Error: ' . mysql_error());
while($a_row = mysql_fetch_array($result, MYSQL_ASSOC)) array_push($results, $a_row);
?>

MySQL SELECT:
SELECT deyiminin bir veritabanından veri seçmek için kullanılır.
* Tüm alanlar istediğiniz gösterir. Sorgunuzla sadece tek bir alan dönmek için bir alan adı ile değiştirme.

"SELECT field_name_1 FROM table_name"

Ayrıca, virgül, sadece Sorgunuzla belirli alanları dönmek için alan adlarını ayırabilirsiniz.

SELECT field_name_1,field_name_2,field_name_3 FROM table_name

Sadece komut dosyası için gereken seçerek alanları alt sunucusu tarafından kullanılan bellek tutmak yardımcı olabilir. Aksi takdirde PHP, gerçekten ihtiyacınız olan alanları daha büyük olabilir tüm satır unutmamalıyız.

Sonuçları filtrelemek için sadece bazı satırları döndürmek isterseniz, WHERE deyimi kullanabilirsiniz.

SELECT * FROM table_name WHERE field_name1='what ever'

Bu bildiri, sadece ‘ne bugüne kadar’ field_name1 değeri satırlar dönerdi. VE / VEYA operatörleri sorguda ekleyerek filtreler daha karmaşık yapabilirsiniz WHERE.

SELECT * FROM table_name WHERE field_name1='what ever' OR id < '5'

Sonuçları belirli bir sıraya göre sipariş etmek için ORDER BY deyimini kullanır ASC veya DESC sıralama için bir yön seçmek için kullanılabilir.

SELECT * FROM table_name ORDER BY field_name1 ASC

Sonuçları çok büyük değildir bu yüzden binlerce satır ile büyük bir tablo sonuçlarına ilişkin bir limit gerekir. Belli bir sayısı sınırlamak için tek bir değer gerekiyor, ancak belirli bir satır başlatın ve sonra sınırlamak isterseniz iki değerler virgülle ayrılmış verebilir. LIMIT 5,20 satır 6 ve 20 sonuçlar verebilir, satır 1 LIMIT 0,10 başlar ve 10 sonuçlar verir.

SELECT * FROM `table_name` WHERE `field_name1`='what ever' ORDER BY `field_name` DESC LIMIT 50

Not: tilde karakterler alan eklenir ve tablo adları adı boşluk vardır. Değeri boşluklar halinde tek tırnak değerler etrafında eklenir. Büyük harf gibi önemli değildir, ancak metin farklılaşması için kullanılan ” select ‘,’ azalan ‘, ya da operatörler.

Web Browser $results gösteriliyor:
Olası Yöntem 1 Çoklu Sonuçlar:
Aşağıdaki kod field_name1 ayrı bir sayfaya tek bir öğeyi görüntülemek için bir bağlantı olarak sıralanmış bir listede sonuçları görüntüler.

<?
if(count($results)){ //IF THERE ARE RESULTS
	//DISPLAY THE RESULTS
	foreach($results as $r){
		echo('<li><a href="single.php?id='.$r[id].'">'.$r[field_name1].'</a>');
		echo(' -- '.$r[field_name2].' -- '.$r[field_name3].'<br><br>');
	}
}else{
	echo('Sorry - no results found');
}
?>

Yöntem 2 Tek Sonuç: Tek sonuçlar sadece dizi $ sonuçları tek bir satır içerir dışında birden fazla sonuç aynı [0] ilk ve tek satır olarak. Birden çok sonuçları da bu tür sonuçlar $ gibi diğer potansiyel dizileri içeren [1] ve $ sonuçları [2]. sonuçları doları [0] [alan_adı] sonuçlarında ilk satır için alan_adı değere erişir.

<?
if(count($results)){
  echo('<a href="single.php?id='.$results[0][id].'">'.$results[0][field_name1].'</a>');
  echo('<br> '.$results[0][field_name2].' <br> '.$results[0][field_name3]);
}else{
	echo('Sorry - no result found');
}
?>

Ders 1 : PHP ile MySQL birlikte kullanmak

Ders 2 : PHP ile MySQL birlikte kullanmak 2