W reakcji na zainstalowanie poprawek do Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-141-generic x86_64) lub wręcz po podniesieniu do wersji 18.04.2 LTS systemu operacyjnego z zainstalowanym silnikiem baz danych PostgreSQL (9.5.14) i bazą danych systemu ERP GRAFFITI (7.6.8T) przy próbie uruchomienia aplikacji klienckiej otrzymujemy w nagrodę:
W logach serwera PostgreSQL widzimy:
2019-03-16 18:52:33 GMT DETAIL: The database was initialized with LC_COLLATE "pl_PL.utf8@bettersort", which is not recognized by setlocale().
2019-03-16 18:52:33 GMT HINT: Recreate the database with another locale or install the missing locale.
Jak by mało tego było to przy próbie połączenia się z bazą danych przy pomocy PGAdmina dostajemy znów między oczy kolejnym błędem:
W odpowiedzi na powyższy problem producent oprogramowania w wiadomości e-mail pisze:
Kodowanie pl_PL@bettersort w wersji Postgresa 9.5 i wyższej jest zbędne do sortowania danych, tym bardziej, że nie jest natywnie wspierane i trzeba je dodatkowo konfigurować. W zupełności wystarczy pl_PL.UTF-8.
Jak widzimy stwierdza jedynie fakt nadgorliwości programistów GRAFFITI, ale nic niestety nie wspomina o rozwiązaniu problemu w kontekście założonej bazy danych dla klienta z sortowaniem typu pl_PL.utf8@bettersort:
i jej nie podlegającej już w cyklu produkcyjnym zainicjowanych ustawień regionalnych LC_COLLATE i LC_TYPE (patrz. https://www.postgresql.org/docs/9.5/locale.html):
Some locale categories must have their values fixed when the database is created. You can use different settings for different databases, but once a database is created, you cannot change them for that database anymore. LC_COLLATE and LC_CTYPE are these categories. They affect the sort order of indexes, so they must be kept fixed, or indexes on text columns would become corrupt. (But you can alleviate this restriction using collations, as discussed in Section 22.2.) The default values for these categories are determined when initdb is run, and those values are used when new databases are created, unless specified otherwise in the CREATE DATABASE command.
Czyli lakoniczność odpowiedzi przestaje dziwić. Cóż co kraj to obyczaj. Pozostają w tej sytuacji trzy drogi:
Odtwarzamy system z archiwum i nic nie robimy, licząc na to, że firma szybciej padnie niż program. Czyli udajemy administratora.
Obchodzimy temat licząc na to, że programista co prawda był nadgorliwy, ale nie wynikało to z tego, że miał na imię Eugeniusz.
localedef -i pl_PL -f UTF-8 pl_PL.utf8@bettersort
Idziemy na całość licząc się z możliwością uszkodzenia indeksów bazy danych.
initdb --pgdata=/path/to/postgresql -E utf8
Wybrałem opcję drugą. Poniżej kilka komend związanych z tematem ku pamięci i orientacji w stanie zastanym i końcowym zmiennych LC:
ustawione właściwości językowe w systemie
vm-graffiti:$ /var/log/postgresql$ locale
LANG=pl_PL.UTF-8
LANGUAGE=
LC_CTYPE="pl_PL.UTF-8"
LC_NUMERIC="pl_PL.UTF-8"
LC_TIME="pl_PL.UTF-8"
LC_COLLATE="pl_PL.UTF-8"
LC_MONETARY="pl_PL.UTF-8"
LC_MESSAGES="pl_PL.UTF-8"
LC_PAPER="pl_PL.UTF-8"
LC_NAME="pl_PL.UTF-8"
LC_ADDRESS="pl_PL.UTF-8"
LC_TELEPHONE="pl_PL.UTF-8"
LC_MEASUREMENT="pl_PL.UTF-8"
LC_IDENTIFICATION="pl_PL.UTF-8"
LC_ALL=dostępne strefy językowe
vm-graffiti:$ /var/log/postgresql$ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN en_IN.utf8
en_NG en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
pl_PL.utf8-
brakuje w powyższym zapytaniu"
pl_PL.utf8@bettersort
zainstalowanie brakujących lub wyłączonych znakiem # w pliku /etc/locale.gen ustawień językowych, których lista jest dostępna w pliku usr/share/i18n/SUPPORTED
vm-graffiti:$ locale-gen pl_PL.utf8
Generating locales (this might take a while)... pl_PL.UTF-8... done Generation complete.- niestety powyższego sortowanie zostanie usunięte z powyższego pliku przy nowszych aktualizacjach systemu. Musimy więc ręcznie dodać do /etc/locale.gen następujący wiersz:
pl_PL.utf8@bettersort UTF8 - teraz zatwierdzamy zmiany w systemie komendą:
- sudo dpkg-reconfigure locales
I na koniec komenda usuwająca (plik binarny) obsługę ustawień regionalnych (alfabet, sortowanie, formatowanie liczb, dat itd) w systemie operacyjnym (notabene to co robi automatycznie sama aktualizacja systemu). Może się przydać, gdy damy ciała, np. przy literówce. ;-P
vm-graffiti:/var/log/postgresql$ sudo localedef --delete-from-archive pl_PL.utf8@bettersort
Literatura piękna: