Leoman’s blog

bi blög

Archive for the ‘charset’ tag

MySQL’de karakter seti problemi yoktur!

one comment

Bir çok insan tarafından şu sözleri duyuyorum;  “MySQL’de veritabanı aktarınca karakter problemi çıkıyor.”, “MySQL’de karakter seti problemi var.”

Hayır efendim MySQL’de karakter seti problemi yoktur, MySQL’in huyunu suyunu bilmeyen insan vardır.

MySQL veritabanı çalışmasında iki tane farklı karakter seti kullanır. Bunlardan birincisi veritabanı motoruna (database engine; MyISAM, InnoDB) verilir. İkincil olarak bağlantı karakter setidir ve MySQL Client’a verilir.

Öntanımlı MySQL kurulumlarında (Örneğin; Distro repolarından, cPanel, Plesk, vb. hosting otomasyon yazılımları ile)  bağlantı ve veritabanı karakter seti latin1 olarak gelmektedir.

En sık yapılan hatayı şöyle basit bir hatadır. Kişi gider veritabanını UTF-8 olarak yaratır. Sonra PHP ile sadece bağlanır ve sürekli veri yazar fakat bu veriyi yazdıran zat-ı muhterem bu sunucuya bağlantı sırasında MySQL Client’ın kullandığı karakter seti merak etmez. Bunu irdelemediği için de UTF-8 veritabanına Latin1 ile bağlanır ve verileri böyle yazar. Sonuç! absürt karakterlere sahip bir veritabanı.

Ne yapıyormuşuz demek ki, veritabanını istediğimiz karakter seti ile yaratıyormuşuz, daha sonra bağlanırken de veritabanının sahip olduğu karakter seti ile bağlanıyormuşuz. Evet tam olarak böyle.

Mesela UTF-8 bir veritabanı yarattığımızı varsayalım. Buna bağlanırken kesinlikle şunu yapmıyoruz;

mysql_connect("server","kullanici","sifre");
mysql_select_db("veritabani");
mysql_query("insert into tablo ('a','b') values ('ÇÖPĞÖÜĞÜ','İŞÜĞÜMÖMÖM')");

Bunun yerine; bağlantıdan hemen sonra bir seferlik;

mysql_connect("server","kullanici","sifre");
mysql_select_db("veritabani");
mysql_query("SET NAMES UTF8");
mysql_query("SET CHARACTER SET UTF8");

mysql_query("insert into tablo ('a','b') values ('ÇÖPĞÖÜĞÜ','İŞÜĞÜMÖMÖM')");

durumu MySQL’e bildiriyoruz.

Tabi ki bir projede 50 yerde bağlantı kuranlar bu noktada OOP’nin neden varolduğunu anlayabilirler.

– “Ee bilmem ne SQL Server bunu otomatik seçiyormuş”.

– Peki multi collation olan bu sistemde farklı farklı tablolar için ne yapmayı düşünüyorsun? diye sormazlar mı kişiye.

Önemli olan nasıl yediğin değil, o yoğurdu yemek!

Written by leoman

June 10th, 2009 at 6:44 pm