ERP GRAFFITI &  pl_PL.utf8@bettersort
UBUNTU & POSTGRES & GRAFFITI

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:

  1. Odtwarzamy system z archiwum i nic nie robimy, licząc na to, że firma szybciej padnie niż program. Czyli udajemy administratora.

  2. 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
  3. 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:

  1. https://www.postgresql.org/docs/9.5/locale.html

  2. https://manpages.ubuntu.com/manpages/xenial/man1/localedef.1.html



Archiwizacja Charta
Program hotelowy firmy LSI (dawniej SOFTECH, a pierwotnie produkt Mikrotel-a)