PostgreSQL Türkçe Karakter Hatasının Çözümleri
Merhaba,
Yaklaşık olarak 7-8 yıldan bu yana MySQL veri tabanı kullanıyorum. MySQL’den PostgreSQL’e geçmeyi hep istiyordum fakat erteleye erteleye bu kadar zaman geçmiş demek ki!
PostgreSQL hakkında uzunca araştırmalardan sonra yeni bir projede kullanmaya karar verdim. Database oluşturup, tabloları create etmeye başladım. Her şey çok güzel gidiyordu 🙂
Ta ki “LIKE” operatörü ile türkçe küçük i veya büyük İ araması yaptığımda sonuçların gelmediğini farkettim. Sonra PostgreSQL’de “ILIKE” operatörü olduğunu farkettim. Fakat bu operatörde problemi çözmemişti. Stackoverflow üzerinde çözümü aramaya başladım. Birçok kişinin bu durumdan muzdarip olduğunu fakat bir sonuca ulaşamadıklarını farkettim. Yada ben bulamadım 🙁 PostgreSQL’de acemi olduğum için sağlıklı bir sonuca da ulaşamadım açıkçası.
Daha sonra twitter üzerinden DM ile M.Atıf Ceylan‘a konunun detaylarını anlattım. Sağolsun, zaman ayırıp bunun neden kaynaklandığını hakkında cevap yazdı.
Bu durumun collate ile alakalı olduğunu, veritabanı oluştururken “tr_TR.utf-8” tanımlamasını yaptığımda sorunun ortadan kalkacağını belirtti.
Ben de veritabanını dışarı aktarıp mevcut veritabanını sildim. Daha sonraki adımları aşağıda belirtiyorum.
Database oluşturma esnasında aşağıdaki gibi LC_COLLATE için tr_TR.UTF-8 değerini belirtiyoruz.
Yine aynı şekilde tablo oluşturma esnasında aşağıdaki gibi COLLATE için tr_TR.UTF-8 değerini belirtiyoruz.
PostgreSQL’in kullandığınız versiyona göre seçebileceğiniz collation ları aşağıdaki sorgu ile bulabilirsiniz.
Yukarıdaki sorguda tr_TR.UTF-8 tanımlı değilse aşağıdaki komutları çalışırın.
Daha sonra aşağıdaki SQL’i çalıştırıyoruz. Çalıştırdıktan sonra listelendiğini göreceksiniz.
Artık türkçe karakter problemi yaşamadan PostgreSQL nimetlerinden faydalanmaya başlayabiliriz 🙂
Son olarak desteği için M.Atıf Ceylan‘a teşekkür ederim.
Bu sayfa 16.715 kez görüntülendi.
Merhaba, malesef bu çözüm docker üzerinde koşan debian yada ubuntu üzerindeki bir postgresql veri tabanı için geçerli değil. 🙁 Yazınızı ilk okurken çok sevinmiştim problemi çözen birisi var diye ama tekrar hüsran 🙁
Docker üzerinde hiç deneme fırsatı buldunuz mu? debian ya da alpine linux üzerinde.
Merhaba,
locale listesine ekleme yaptıktan sonra postgresql’i yeniden başlatmak gerekebiliyor.
**
service –status-all
service postgresql status
service postgresql restart
**
Teşekkürler restart yapınca eklendi.
Merhaba, psql v12 kullanıyorum. Lc_locate ve c_type ayarını yaptım db’de fakat arama yaparken i ve ı harflerinde büyük küçük problemi var hala örnek verecek olursam ILIKE kullanıyorum İ diye aratınca İSTANBUl’u buluyor kümük i yapınca maalesef bulamıyorum
Hüseyin Merhaba,
Mevcut veritabanını silip, aşağıdaki syntax ile tekrar oluşturur musun?
LC_CTYPE parametresi ile de dener misin?
CREATE DATABASE test_db ENCODING='UTF-8' LC_COLLATE = 'tr_TR.UTF-8' LC_CTYPE='tr_TR.UTF-8' TEMPLATE template0;
Maalesef işe yaramadı en azından windows için
Merhaba, Windows için bu yöntem işe yaramıyor maalesef. Direkt kolonu TR olarak ayarlamanız gerekiyor o şekilde problem çözülüyor.
Kolonun Collation alanını “tr-TR-x-icu” olarak ayarlamalısınız. O zaman problem çözülüyor.
Ek olarak, string olarak bi lower vs. yapacaksanız; LOWER(“mystring” COLLATE “tr-TR-x-icu”) şeklinde kullanmalısınız. Bu şekilde windows üzerinde de düzgün çalışıyor.
Merhabalar, veritabanını oluştururken default olarak “tr-TR-x-icu” tanımlayamıyor muyuz acaba?
merhaba windows için
CREATE DATABASE tr WITH TEMPLATE = template0 ENCODING = ‘UTF8’ LC_COLLATE = ‘C’ LC_CTYPE = ‘Turkish_Turkey.1254’
Arkadaşlar ef core code first ile PostgreSql kullanımında türkçe karakter problemi yaşıyor iseniz vermiş olduğum kod parçasını DbContext sınıfındaki OnModelCreating metodunu override ederek içine yazınız. Migration oluşturma aşamasında gerekli konfigürasyonları yaparak türkçe karakter problemini çözüyoruz.
modelBuilder.UseDatabaseTemplate(“template0”);
modelBuilder.UseCollation(“C”);
modelBuilder.Entity().Property(p => p.Name).UseCollation(“tr-TR-x-icu”);
modelBuilder.UseTablespace(“pg_default”);
Bütün entityleriniz için string kolonlarına 3. satırda yazmış olduğum gibi colletion eklemelisiniz.
Bütün entityler için bu satırı yazacakmıyız dersenizde ef core da tek bir metot ile de çözebilirsiniz.
Postgresql’i yüklediğiniz klasörde türkçe locale dosyasını silerseniz sorun halloluyor.
Misal:
C:\Program Files\PostgreSQL\14\share\locale
Yukarıdaki path üzerinde bulunan diller arasından tr klasörünü sildim. Artık psql shell içerisinde gerek help menüsü olsun gerekse aldığım uyarılar olsun, Türkçe’den İngilizce’ye döndü.
Merhaba. locage-gen komutu çalıştırdıktan sonra sunucular en_US locale’i değişecek midir? Sunucuların bu locale’de en_US olarak kalmasını sağlayarak ek bir locale olarak ekleme bu şekilde mi oluyor?