django versus mysql: karakter seti problemleri

bildiğiniz üzere mysql varsayılan olarak “latin1_swedish_ci” karakter setiyle geliyor. django ise, her yerde – hemen hemen her yerde değil, her yerde- unicode kullanıyor.

modellerinizi yazdıktan sonra “python manage.py syncdb” yapıp, tablolar yaratıldıktan sonra “süper kullanıcı” girmek isterseniz, standart bir mySQL kurulumunda (ubuntu gnu/linux) aşağıdaki hatayı alıyorsunuz:

...
Warning: Incorrect string value: '\xC4\xB1nc\xC4\xB1...' for column 'name' at row 1

django, her şeyi her yerde unicode kullanmasına rağmen, mysql’de tabloları yaratırken karakter seti olarak utf8_*_ci belirtmiyor. hatta belirtmek de istemiyor buradaki hata girdisinde görebileceğiniz üzere. O kısım, mysql sunucunun standart ayarlarıyla çalışıyor. (Django’nun “it is not a bug, it is a feature!” anlayışını sorgulamaya başladım son zamanlarda.)

her neyse, sorunun çözümü basit. mysql sunucusunu standart olarak utf8 ile çalışacak şekilde ayarlamanız gerekiyor. ubuntu için (ve bir çok linux dağıtımı için) root yetkileriyle aşağıdaki yolu takip edebilirsiniz:

/etc/mysql/conf.d/ dizini içine charset.cnf şeklinde bir dosya açın ve içine aşağıdakileri girin ve kaydedin.

[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci
character-set-server=utf8
collation-server=utf8_general_ci
init_connect=’SET collation_connection = utf8_general_ci’
init_connect=’SET NAMES utf8′
skip-character-set-client-handshake

uyarı: uzattığınız dosyanın uzantısı kesinlikle .cnf olmaılıdır. mysql, sadece .cnf uzantılı dosyaları dikkate alıyor.

mysql sunucusunu yeniden başlatın:

/etc/init.d/mysql restart

sorun kalmayacaktır ;)

Leave a comment

Your comment