upload siteleri

ZoRRoKiN

Özel Üye
7 Ağu 2005
2,149
376
WORLD
MySQL 4.1.x ve Türkçe Karakter Sorununun Çözümü

KONU DEĞİŞMİŞTİR SEBHEB DÜZENLENME NEDENİNDE VAR

Bu makalede bir çok arkadaşımızın resmen işkence yaşadığı mysql 4.1.x sürümü ve türkçe karakterlerin sorunsuz* düzgün şekilde görüntülenebilmesi için nasıl ayarlanacağını anlatacağım.

İlk önce çalışmaya başlamadan önce: https://tik.lat/2IdLj adresinden MySQL 4.1.x serisinin son sürümünü download ediyoruz.

Konumuz türkçe karakterler olduğu için mysql'nin kurulumunu anlatmıyorum.

Söze başlamak gerekirse* öncelikle MySQL 4.1.x sürümünde türkçe 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ış configürasyonundan kaynaklanmaktadır.

MySQL 4.1.x serisi ile birlikte yeni bir özellik olarak gelen* karakter setleri (charset) ve buna eşit karşılaştırma setleri (collation)* özellikle daha önceki 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 türkçe karakterler için 2 ayrı karşılaştırma seçeneği bulunmaktadır.

Bunlar;

* latin5_bin (büyük* küçük harf duyarlı)
* latin5_turkish_ci (büyük* küçük 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 çok 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 için en doğru tablo oluşturmasını yapalım:



Kod:
CREATE TABLE tablo1 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY*
name VARCHAR(50)
) CHARSET=latin5;


Bu tabloda karşılaştırma seçeneği girilmediği için varsayılan karşılaştırma; latin5_turkish_ci kullanır.

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



Kod:
CREATE TABLE tablo1 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY*
name VARCHAR(50)
) CHARSET=latin5 COLLATE=latin5_bin;



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

En önemli kısım veri tabanı oluşturmada bitiyor.. eğer yukarıdaki sabit ayarlarla bundan sonraki oluşturulacak bütün tabloları latin5 ve karşılaştırması: latin5_turkish_ci tanımlamasını otomatik olarak kullanmasını sağlamak için* veri tabanını aşağıdaki gibi oluşturuyoruz (latin5_turkish_ci için örnek);


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 türkçe karakterlerin yerine sayfanızda soru işaretleri çıkacaktır '?' gibi.

Bununda çözümü çok basit* mysql bağlantısı yaptığınız sorgu koduna aşağıdaki eklentiyi yapmanız yeterli;

mysql_query("SET NAMES 'latin5'"
icon_wink.gif
;

Böylece bağlantı yapılacak istemcinin karakter seti latin5 olarak tanımlanır ve karakterler doğru görüntülenir.

SERVER SAHİPLERİ:

Eğer kullanıdığız makine kendinize ait ve mysql 4.1.x türkçe ayarlarını düzgün yapmak istiyorsanız* aşağıdakileri uygulamalısınız:

Öncelikle mysql başlatma satırında şu şekilde değişiklik yapın: (etc/init.d/mysqld)


Kod:
/usr/bin/mysqld_safe --defaults-file=/etc/my.cnf
--default-character-set=latin5 --pid-file="$mypidfile" >/dev/null 2>&1 &


Ardından my.cnf dosyanızı açın:

[mysqld] bölümüne init-connect="SET NAMES latin5" satırını ekleyin.

Ayrıca* [mysqld_safe] ve [client] bölümlerinede aşağıdaki eklemeleri yapın:



Kod:
default-character-set=latin5
default-collation=latin5_turkish_ci


değişiklikleri yapıp mysql sunucunuza reset atın ve değişikliklerin aktif olduğu göreceksiniz!

Not: show variables; sorgusunda çıkan system-character-set-UTF8 yazan yer kesinlikle değişmemektedir* bu mysqlnin 4.1.x serisiyle beraber değiştirilmez bir karakter seti olarak gelir.

MySQL 4.1.x ile beraber değişen özellikler sadece bununla sınırlı değil* YEDEK ALIRKEN DİKKAT!!!! mysqldump* phpmyadmin ve benzeri yedekleme yazılımları üzerinden alınan yedeklerde mutlaka yedeğin karakter seti belirtilmesi gerekir! aksi takdirde yedek bozuk karakterle alınır. Latin5 karakter seti kullanan veri tabanlarını yedeklerken herzaman:

Yedek alırken:



Kod:
mysqldump --default-character-set=latin5 -u veritabanı_kullanıcıadı -p veritabanıadı > /dizin/yedek.sql



Bu şekilde alınan yedeği yüklerken:


Kod:
mysql --default-character-set=latin5 -u veritabanı_kullanıcıadı -p veritabanıadı < /dizin/yedek.sql


böylece yedekler sağlıklı bir şekilde veri tabanına aktarılır. Mümkünse phpmyadmin gibi yazılımlar üzerinden yedek almamaya özen gösterin.

küçük not: mysql 4.1.x serisi ile dumpta --opt ve -Q anahtarları varsayılan özellikler arasına girdiğinden* yukarıdaki komutta kullanmadık.

Ayrıca aşağıdaki örnek sorgularla sistemdeki türkçe karakter setleri hakkında bilgi alabilirsiniz;



Kod:
mysql> SHOW COLLATION LIKE '%turk%';


+-------------------+---------+-----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+-----+---------+----------+---------+
| latin5_turkish_ci | latin5 | 30 | Yes | | 0 |
| utf8_turkish_ci | utf8 | 201 | | Yes | 8 |
| ucs2_turkish_ci | ucs2 | 137 | | Yes | 8 |
+-------------------+---------+-----+---------+----------+---------+
3 rows in set (0.00 sec)



Kod:
mysql> SHOW COLLATION LIKE '%latin5%';



+-------------------+---------+----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin5_turkish_ci | latin5 | 30 | Yes | | 0 |
| latin5_bin | latin5 | 78 | | | 0 |
+-------------------+---------+----+---------+----------+---------+
2 rows in set (0.00 sec)



Evet böylelikle MySQL 4.1.x serisindeki karakter sorunlarını kökten çözmüş bulunmaktayız* hepinize faydalı olması dileğiyle..
 
Son düzenleme:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.