[Sortowanie w PostgreSQL uwzględniające zasady obowiązujące dla konkretnego języka może być dość kłopotliwe. Niestety PostgreSQL nie pozwala na dynamiczne zmienianie sposobu sortowania tak jak jest to możliwe w MySQL (klauzula COLLATE) albo w Oracle (parametr sesji NLS_SORT), tylko wymaga podania sposobu sortowania podczas tworzenia klastra (parametry –locale, –lc-collate i poniekąd –lc-ctype polecenia initdb) i później już parametry te pozostają niezmienne.
Czyli raz zainicjowanego klastra bazy danych nie możemy już przestawić na inne kodowanie. Kodowanie danego klastra bazy danych jest brane z systemu. Aby sprawdzić, jakie kodowania mamy aktualnie dostępne używamy komendy locale -a. Problem z domyślnymi kodowaniami był taki, że kolejność sortowania polskich znaków w systemie UTF nie odpowiadała sortowaniu stosowanemu w win1250 a definicji takiego kodowania nie ma na Linuksie. Jeśli zastosujemy domyślne kodowanie UTF na Linuksie mogą pojawić się problemy z wyszukiwaniem nazw z symbolami _ + – = lub z sortowaniem list alfabetycznie.
Podany sposób działa tylko na dystrybucjach z serii Debian. Na innych dystrybucjach rozwiązanie tego problemu pozostaje nieznane.
Aby dodać kodowanie do systemu należy:
1. Ściągnąć plik z definicją nowego locale z załącznika – nazywa się on pl_MOD ale nic nie stoi na przeszkodzie, aby nazwać go inaczej.
2. Przekopiować go do katalogu /usr/share/i18n/locales
3. Dopisać w pliku /usr/share/i18n/SUPPORTED na końcu linijkę pl_MOD UTF-8
4. Dopisujemy w pliku /etc/locale.gen linijkę pl_MOD.UTF8 UTF-8
5. Generujemy nowy locale wydając jako root w konsoli polecenie locale-gen. Jedną z linijek wynikowych tego polecenia powinno być: pl_MOD.UTF-8… done
6. Patrzymy czy stworzone przez nas locale pojawiło się na liście komendą locale -a.
W wyniku powinna być linijka: pl_MOD.utf8
7. Pozostaje nam tylko zainicjować klaster bazy danych z nowym locale. Jako użytkownik postgres wydajemy polecenie:
/sciezka/do/postgresa/bin/initdb–locale=pl_MOD.utf8-D/sciezka/do/katalogu/z/baza. Następnie uruchamiamy postgresa z nowym klastrem.
Plik z definicją LOCALE dla Linux można pobrać z tego miejsca.