MySQL 4.1.x ve Türkçe Karakter Sorununun Çözümü
->
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: http://dev.mysql.com/downloads 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:
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;
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);
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;
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′”);
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)
/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:
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:
mysqldump --default-character-set=latin5 -u veritabanı_kullanıcıadı
-p veritabanıadı > /dizin/yedek.sql
Bu şekilde alınan yedeği yüklerken:
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;
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)
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..
güzel bir yazı olmuş.Teşekkürler…
Bende zokie ye teşekkür ediyorum
ARKADAÅLAR MERHABA ÖNCELİKLE YUKARDAKİ YAZININ SAHİBİNE TEÅEKKÃRLERİMİ İLETİYORUM..
Benim bir sorum olacak daha onceden charset=windows-1254″
olarak mysql gonderdıgım verıler mysql 4.2.x gectikten sonra otomatik olarak karşıkaştırmaları latin1_swedish_ci oldular ben bunu phpmyadminden duzeltip latin5_turkish_ci yapıyorum ama karakterler de ? işareti çıkıyor eğer yeni kayıt eklersem bir problem yok ama eski kayıtları da nısıl düzeltebilirim…Åimdiden tşk.
Bu şekilde nasıl yaparsan yap sorun kalmaz.Yedeği bu şekilde al geri yükle.4.2.x geçtikten sonra demişsin ama nerden geçtin eğer 4.0 ise phpmyadminde yedek alırken seçebileceğin bi yer biliyorum
arkadaslar ben de de aynı sorun var durum su
Onceki sunucuda mysql 4.0 vardı ve karakter karşılaştırması diye bir şey yoktu bizim hosting firması mysql yukseltmiş ve mysql versiyonu şu an 4.1.2 olmuş . şu an sitede karakterlerde problem gozukmuyor ama phpmyadmine gırıp yedek alıp(baska sekılde yedek alamıyorum) lokalde yukledıgımde karakterler bozuluyor . suan karsılastırmalar latin1_swedish_ci olarak gozukuyor phpmyadmınden bunları duzeltıp latin5 ama karakterler duzelmıyo lutfen yardım cok acıl Ins anlamıssınızdır problemi
merhaba bir sorunum var
oluşan tablo ısımlerının dil karakterinı nasıl toplucam sql sorgudan değiştirebiliriz
şu an hepsinin karakter yapısı UTF8 ben latin5 olarak topluca değişmesini istiyorum
tesekkurler
merhabalar.
tablomu yukarıda anlatılan şekilde oluşturdum ve türkçe karakterler mysql’in querybrowser’inde görülebiliyor.
querybrowser’dan elle insert edince de bir sorun çıkmıyor.
ankcak, vb.net express 2008 ile yazdığım programdan tabloya eklediğim türkçe karakterlerde sorun var. ş -> s, ı -> i şeklinde gösteriyor.
acaba ne yapmam gerek?
Arkadaşlar öncelikle verdiğiniz bilgiler için teşekkürler.Bende bu konuda bir iki satır birşeyler yazmak istiyorum.İki üç gündür mysql charset ile ilgili problem yaşıyordum.Galiba bu problemi tamamen çözdüm.
mysqldump –default-character-set=latin5 -u *** -p***** 2009tupsu >C:\tup_su\TupSu2009211172930.txt
delphi kodu yazdım ama farketmez…
Bu mysql dump komutu ile türkçe karekterler bozulmadan yedek alabilmek için
mysql.ini dosyasında
[client] kısmının altına
character-sets-dir=”C:\AppServ/MySQL/share/charsets/”
bu satırı eklemeniz geekiyor.Burda dikkat etmeniz gereken dogru yolu yazmak bu mysq kurulu oldugu dizine göre degişir.Daha sonra mysql resetlediginiz takdirde herhangi bir problem yaşamadan mysqldump ile yedek alabilirsiniz.
mysql connect olurken yaşadıgınız karekter problemleri için ise connect olduktan hemen sonra
Islem.SQL.Add(’SET NAMES ‘+QuotedStr(’latin5′));
şeklinde bir sorgu göndermeniz problemi ortadan kaldıracaktır.
Arkadaşlar küçük birşey unuttum.
mysqldump ile yedege geri dönerken sorun yaşadım ben o yüzden başka bir yöntem kullandım.
mysql> create database test;
mysql> use test;
mysql> source test.sql;
bu komutları kullanarak rahatlıkla yedekleri geri yükleyebiliyoruz.Bir bat dosyası oluşturarak yapabiliriz yanılmıyorsam bu işlemi.