ana sayfa > PHP ve MYSQL > MySQL 4.1.x ve Türkçe Karakter Sorununun Çözümü

MySQL 4.1.x ve Türkçe Karakter Sorununun Çözümü

Salı, 30 May 2006

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..

Kaynak: http://forum.iyinet.com/showthread.php?t=25541 dan zokie yazdı,tşk ediyoruz kendisine, bire bir (ç)alıntıdır. :)

  1. y
    Pazartesi, 19 Haz 2006 zamanında 05:47 | #1

    güzel bir yazı olmuş.Teşekkürler…

  2. selim61
    Salı, 20 Haz 2006 zamanında 11:38 | #2

    Bende zokie ye teşekkür ediyorum ;)

  3. muhammed
    Cuma, 10 Kas 2006 zamanında 01:55 | #3

    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.

  4. Cuma, 10 Kas 2006 zamanında 02:45 | #4

    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

    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

  5. hasan
    Cumartesi, 11 Kas 2006 zamanında 03:14 | #5

    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

  6. metas
    Salı, 04 Eyl 2007 zamanında 03:35 | #6

    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

  7. evox
    Salı, 18 Mar 2008 zamanında 03:39 | #7

    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?

  8. bilal
    Perşembe, 12 Şub 2009 zamanında 03:57 | #8

    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
    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.
    :) delphi kodu yazdım ama farketmez…

  9. bilal
    Perşembe, 12 Şub 2009 zamanında 04:51 | #9

    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.

  1. şimdilik geri bağlantı yok