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'"
;
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..
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'"
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: