Recherche und Rechercheergebnisse
Filter vs. Recherche

Problematik:

Es scheint ein Problem zu geben, wenn bei der Filterabfrage (Filter erstellen) nach einem Wert mit einem Umlaut gefiltert wird z.B. BEZEICHNUNG ist gleich "Zerstörtes Gebäude"
In der Karte wird dann nichts angezeigt.
In der Sachdatenrecherche funktioniert eine entsprechende Abfrage und listet die Ergebnisse im Sachdatenfenster auf.

Ursache:

Die Problematik hängt mit der Codierung der DB zusammen und wie die Suche/Recherche (wird in der SQLLite DB ausgeführt) und der Filter (wird direkt in der DB ausgeführt) im cardo4 ausgeführt werden.

Testweise kann folgendes in der Datenbank ausgeführt werden:

select 'Ä' = upper('ä')

Wenn die Datenbank in UTF8 eingerichtet ist, kommt bei dieser Abfrage false als Ergebnis heraus.

Wenn Sie die gleiche Abfrage im GeoSQL ausführen, kommt true raus.

Das verursacht das unterschiedliche Verhalten im cardo4 und das Verhalten, dass der Filter nicht korrekt angezeigt wird.

Lösung:

Beim Neuanlegen einer DB gibt es die Möglichkeit mittels einer Standard-Collection das Problem zu behandeln. Eine bestehende DB zu ändern scheint nicht möglich zu sein. Die andere Möglichkeit wäre die Umstellung der DB auf Latin1.

PostgreSQL UTF-8 und korrekte Sortierung/Upper/Lower/... mögliche Lösung

Um eine Speicherung aller möglichen Zeichen in einer Datenbank zu ermöglichen, ist es notwendig, dass man eine PG-Datenbank mit dem Encoding UTF-8 einrichten muss. Dort besteht aber das Problem, dass Sortierungen und Upper/Lower Funktionen mit "Sonderbuchstaben" nicht gut funktionieren.

upper(„ä“) != upper(„Ä“)

Die Lösung dafür ist, dass man der Datenbank gleichzeitig schon eine Standard-Collation mit auf den Weg gibt (dies geht nur beim Anlegen).

Weitere Details:

  • CREATE COLLATION de_DE (LOCALE = 'German_Germany.1252');
  • Die Bezeichnung de_DE ist hier "beliebig" gewählt worden. Der Text hinter LOCALE ist die Bezeichnung im Betriebssystem. "German_Germany.1252" sollte es auf Windows geben. Bei anderen OS ggf. mal die PG-Hilfe konsultieren.

  • An allen Stellen, wo man dann die Collation benutzen will, muss man es dann so tun (gleiche Bezeichnung verwenden, wie vorher angelegt wurde):

    select strasse from basedata.adr_nt_strassen order by strasse COLLATE de_DE;

  • Man kann auch gleich schon die "de_DE" Collation als Standard für die DB einstellen. (Muss, wie gesagt, vorher schon mal angelegt worden sein die Collation. Ggf. erst mal eine "Dummy"-DB anlegen)

Resümee:

  • Sogar Buchstaben, die mit dem deutschen Alphabet nix zu tun haben, hier kyrillische und bestimmte tschechische Zeichen, werden korrekt behandelt.

 weitere Infos: https://www.postgresql.org/docs/current/locale.html