Sistem saati: 07 Eyl 2010, 07:41

Tüm zamanlar UTC + 2 saat [ DST ]




Yeni konu gönder Konuya cevap yaz  [ 1 ileti ] 
Yazar Mesaj
 İleti başlığı: Postgresql'de Türkçe problemleri
Yeni iletiTarih: 03 Arl 2008, 19:05 
Site Admin
Kullanıcı avatarı

Kayıt: 21 Oca 2008, 20:46
İleti: 11
Debian Etch altında PostgreSQL 8.1 kullanıyorum. Oluşturduğum veritabanları UTF-8 olmasına rağmen Türkçe karşılaştırma ve sıralamalarda sorun yaşıyordum. Bu problemi gidermek için yaptıklarımı sizlerle paylaşmak istedim, belki birinin işine yarar.

Öncelikle şunu belirtmek gerekiyor ki, apt-get install ile postgresql kurduğunuzda veritabanı sisteminin genel dil ayarları en_EN.UTF8 olarak ayarlanmış oluyor. Bu nedenle, veritabanı sisteminin ilgili tüm ayarlarının güncellenmesi gerekiyor.

Eğer sadece istemci tarafında karakterlerin doğru görünmemesi ile ilgili bir probleminiz varsa bunu istemci tarafında sorgu yaparken, istemci sorgularının encoding'ini belirterek çözebilirsiniz. Bu başka bir yazının konusu olduğu için geçiyorum.

Bizim asıl amacımız, kayıtlarla ilgili "like" ve benzeri sorgular yaparken ya da sıralama işlemi yaparken Türkçe karakterlerle ilgili yaşadığımız problemleri gidermek. Aslında bunu yaparak, muhtemelen istemci tarafında karakterlerin düzgün görüntülenmesi ile ilgili problemi de (eğer istemci tarafında dil ile ilgili ayarlar, veritabanı ile paralel olacak şekilde ayarlanmışsa tabi) gidermiş olacağız.

Ancak büyük bir sorun var ki, PostgreSQL de veritabanı sisteminin genel "encoding"ini değiştirmek için veritabanı sistemimizdeki "main" veritabanını (aslında tüm tablo ve veritabanlarınızı taşıyan yapı) silip doğru parametrelerle tekrar oluşturmamız gerekiyor.

Bu işlem de veritabanı sistemi üzerindeki tüm dataları yedekleyip, tekrar yeni oluşacak yapıya eklememizi gerektiriyor. Riskli sayılabilecek bir iş maalesef. Bu nedenle aşağıdaki işlemlerin %100 çalışacağı garantisi veremiyorum.

Öncelikle tüm verilerimizi yedekleyelim. Bunun için öncelikle root olalım ve verileri yedekleyelim.

Kod:
sudo -s;
sudo -u postgres pg_dumpall > sqldump.txt;


Daha sonra veritabanı sunucusunu durdurarak, "main" veritabanını sileceğiz (aslında ne olur ne olmaz diye main.old diye yedekleyeceğiz). Sonra yeniden oluşturup çalıştıracağız. Benim PostgreSQL versiyonum 8.1 olduğu için aşağıdaki kodlarda 8.1 yazıyorum.

Kod:
/etc/init.d/postgresql-8.1 stop;
cd /var/lib/postgresql/8.1/;
mv main main.old;
sudo -u postgres /usr/lib/postgresql/8.1/bin/initdb -D main --locale=tr_TR.UTF-8;
/etc/init.d/postgresql-8.1 start;


Sonrasında da yedeklediğimiz sql çıktısını tekrar veritabanına ekleyeceğiz. Yukarıda sqldump.txt'i oluşturduğunuz klasöre giderek aşağıdaki komutu çalıştırın.

Kod:
sudo -u postgres psql < sqldump.txt


Bu işlemler sonunda veritabanı sistemimizin dil kodlamasını değiştirmiş olduk ancak veritabanı ile ilgili tüm parametreleri Türkçe UTF-8 haline getirmek istersek /etc/postgresql/8.1/main/postgresql.conf dosyasını açarak aşağıdaki bölümdeki değişken değerlerini aşağıda gösterildiği gibi tr_TR.UTF-8 olarak değiştirmeliyiz.

Kod:
# These settings are initialized by initdb -- they might be changed
lc_messages = 'tr_TR.UTF-8'         # locale for system error message strings
lc_monetary = 'tr_TR.UTF-8'         # locale for monetary formatting
lc_numeric = 'tr_TR.UTF-8'          # locale for number formatting
lc_time = 'tr_TR.UTF-8'             # locale for time formatting


Bu değişiklikleri yaptıktan sonra da değişikliklerin geçerli olabilmesi için postgresql'i yukarıda yaptığımız gibi yeniden başlatın.

Bunca değişiklikten sonra, göreceksiniz ki hala SQL sorgularınızda "~*" şeklinde yaptığınız harf büyüklüğüne bağlı olmayan (case insensitive) Türkçe değer karşılaştırmalarında problem yaşıyorsunuz. Bunu çözmek için, benim bulabildiğim ve birçok yerde önerilen tek çözüm, her iki değeri de küçük harfli hale getirmek. Bunu yapmak için lower() fonksiyonunu kullanmalıyız.

Örnek :
Kod:
Select * from testdb where lower(testfield) ~* lower('Örnek Veri');


Bununla ilgili başka yaşadığınız problemler var ise, bu yazının altına iletebilirsiniz.


Çevrimdışı
 Profile bak E-posta  
 
Önceki iletileri göster:  Sıralama  
Yeni konu gönder Konuya cevap yaz  [ 1 ileti ] 

Tüm zamanlar UTC + 2 saat [ DST ]


 Kimler çevrimiçi

Bu forumu görüntüleyenler: Kayıtlı kullanıcı yok ve 1 misafir


Bu forumda yeni konular açamazsınız
Bu forumda konulara cevap yazamazsınız
Bu forumda kendi iletilerinizi değiştiremezsiniz
Bu forumda kendi iletilerinizi silemezsiniz
Bu forumda dosya ekleyemezsiniz

Arama:
Git:  
 
cron