Böylece, üzerinde PostgreSQL bulunan birkaç Debian sunucusu var. Tarihsel olarak, bu sunucular ve PostgreSQL Latin 9 karakter kümesi ile yerelleştirildi ve o zamanlar iyiydi. Şimdi Polonyaca, Yunanca veya Çince gibi şeylerle başa çıkmak zorundayız, bu yüzden bunu değiştirmek gittikçe büyüyen bir konu haline geldi.
UTF8 veritabanı oluşturmaya çalıştığımda şu mesajı aldım:
HATA: UTF8 kodlaması yerel ayar fr_FR ile eşleşmiyor Detay: Seçilen LC_CTYPE ayarı LATIN9 kodlamasını gerektirir.
Birkaç kez eski dostum Google ile konuyla ilgili bazı araştırmalar yaptım ve bulabildiğim tek şey Debian'ı güncellemek, LANG
PostgreSQL'i doğru karakter grubuyla yeniden düzenlemek, tüm LC_
sistem değişkenlerini ve diğer karanlık çözümleri düzeltmek gibi aşırı karmaşık prosedürlerdi . Şimdilik bu konuyu bir kenara bıraktık.
Son zamanlarda, yine geri geldi, Yunanlılar eşyayı istiyor ve Latin 9 da istemiyor. Ve yine bu konuyu araştırırken, bir meslektaşım yanıma geldi ve “Hayır, kolay, bak” dedi.
Hiçbir şey düzenlemedi, sihir numaraları yapmadı, sadece şu SQL sorgusunu yaptı:
CREATE DATABASE my_utf8_db
WITH ENCODING='UTF8'
OWNER=admin
TEMPLATE=template0
LC_COLLATE='C'
LC_CTYPE='C'
CONNECTION LIMIT=-1
TABLESPACE=pg_default;
Ve iyi çalıştı.
Aslında bilmiyordum LC_CTYPE='C'
ve bunu kullanmanın Google’daki ilk çözümlerde ve hatta Stack Overflow’ta olmadığına şaşırdım. Etrafıma baktım ve yalnızca PostgreSQL belgelerinde bahsettim.
LC_CTYPE C veya POSIX ise, herhangi bir karakter setine izin verilir, ancak LC_CTYPE'nin diğer ayarları için düzgün çalışacak yalnızca bir karakter seti vardır. LC_CTYPE ayarı initdb tarafından dondurulduğundan, bir kümenin farklı veritabanlarında farklı kodlamaları kullanmak için görünen esneklik, C veya POSIX yerel ayarını seçtiğinizde (dolayısıyla gerçek yerel ayar farkındalığını devre dışı bırakarak) dışında gerçekten daha teoriktir.
Bu yüzden beni meraklandırdı, bu çok kolay, çok mükemmel, olumsuz nedir? Ve henüz bir cevap bulmakta zorlanıyorum. Yani burada buraya gönderme geliyorum:
tl; dr: Belirli bir yerelleştirmeyi kullanmanın olumsuz tarafı nedir LC_CTYPE='C'
? Bunu yapmak kötü mü? Ne kırmayı beklemeliyim?