Announcement

Collapse
No announcement yet.

Eigennamen mit Umlauten sortieren nach DIN 5007-Var2

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Eigennamen mit Umlauten sortieren nach DIN 5007-Var2

    Server Version: WI-V2.5.2.26540 Firebird 2.5
    Server Implementation: Firebird/x86-64/Windows NT
    DB-Manager: IbExpert Personal

    Wer weiß Rat?
    Ich muß eine UTF8-Tabelle mit deutschen Eigennamen, die Umlaute enthalten, so sortieren, daß ä wie ae behandelt wird, o wie oe, u wie ue und ß wie ss. Dies gelingt mir mit der Collation UNICODE jedoch nicht, denn damit erfolgt die Sortierung nach DIN 5007 Variante 1. Ich benötige jedoch Variante 2 (Telefonbuch-Sortierung), wie bei Wikipedia beschrieben.

    Was ich bereits erfolglos versucht habe:

    1. Ich habe mir die erweiterten ICU's heruntergeladen und installiert, indem ich sie in der Datei fbintl.conf eingetragen habe, die im Ordner INTL zu finden ist:
    <intl_module builtin>
    icu_versions 5.0 default
    </intl_module>

    <intl_module fbintl>
    filename $(this)/fbintl
    icu_versions 5.0 default
    </intl_module>


    Die entsprechenden DLLs im Ordner BIN habe ich ausgetauscht: icudt30.dll, icuin30.dll und icuuc30.dll in ein Archiv verschoben und durch icudt50.dll, icuin50.dll und icuuc50.dll ersetzt. Selbstverständlich habe ich zuvor den Serverdienst beendet und hinterher wieder gestartet. Das hat nicht funktioniert, der Dienst startete erst wieder, nachdem ich die 30er-Dlls wieder in den BIN-Ordner zurückkopiert hatte.

    2. Danach habe ich die verfügbaren Collations durchgetestet (es waren dieselben wie zuvor verfügbar), konnte jedoch keine Änderung in der Sortierung feststellen. Ich vermute daher, daß die erweiterten ICUs nicht verwendet werden. Muß ich die noch irgendwo anders eintragen?

    Was kann/muß ich generell tun, um die gewünschte Sortierung zu bewerkstelligen?
    Zuletzt editiert von Perlsau; 18.07.2016, 03:32.
    Die Tränen, die du nicht weinen willst, müssen andere für dich vergießen. (Frei nach: wer nicht leiden will, muß hassen.)

  • #2
    Originally posted by Perlsau View Post
    Was kann/muß ich generell tun, um die gewünschte Sortierung zu bewerkstelligen?
    Keine Ahnung, schau mal hier, da heisst es, Collation selber erzeugen..
    https://www.mail-archive.com/firebir.../msg14610.html
    Vielleicht ist das eine Fährte.
    Gruß, defo

    Comment


    • #3
      Hi Defo, danke für den Link. Wie ich eine neue Collation erzeuge, weiß ich jedoch bereits, auch wie ich sie verfügbar mache (Eintrag in ), doch nützt mir dieses Wissen nichts, da ich ja lediglich eine Kopie einer existierenden Collation anlegen kann, die ich in ihrer Sortierfolge jedoch nicht zu ändern vermag. Was ich konkret nicht weiß und gerne erfahren würde: Wie lege ich eine neue Collation an, die Variation 2 der deutschen Sortierreihenfolge verwendet, wie in meinem Eingangsposting beschrieben? Ich konnte bislang nirgendwo Informationen über die gültigen Parameter bei create collation finden. Im Language Reference Update für die Version 2.5 steht leider auf Seite 38 auch nur, wie man eine Collation erzeugt und zum Einsatz vorbereitet, nicht aber, wie man sie ändert bzw. an die eigenen Bedürfnisse anpaßt. Die specific attributes werden erklärt, nicht jedoch der Parameter attribute. Hier könnte man womöglich was wesentliches angeben, wie ich vermute, weil man hier einem Attribut-Namen einen Attribut-Wert zuweisen kann. Ich kenne jedoch weder die erlaubten Attribut-Namen noch ihre Bedeutungen und die erlaubten Werte. Ein Versuch, der neuen Collation die neuen ICUs zuzuweisen, schlug fehl bzw. wurde mit Fehlermeldung quittiert. Ich weiß ja nicht einmal, ob die neuen ICU-Versionen überhaupt verwendet werden, da Firebird ohne die alten ICUs nicht startet, obwohl die neuen eingetragen wurden. Kennt sich damit jemand aus?
      Die Tränen, die du nicht weinen willst, müssen andere für dich vergießen. (Frei nach: wer nicht leiden will, muß hassen.)

      Comment


      • #4
        Schau mal hier denn Punkt "Collation locale and keyword handling".
        Möglicherweise kann man das Sortierverhalten via der "Locale" dem System unterjubeln.

        Hast du die Frage gestern zufällig auch in der Firebird Mailingliste gestellt? Ich hätte da ne passende Frage in meiner Mailbox gefunden

        Comment


        • #5
          Hi Ralf Jansen, danke für die schnelle Antwort. Und ja, die Anfrage in der Mailingliste stammt von mir. Leider wußte ich nicht, wie ich diese Mailingliste hier verlinken kann, um ein Crossposting anzuzeigen.

          Wenn ich das richtig verstanden habe, muß ich folgenden SQL-Befehl absetzen, um die gewünschte Collation zu erzeugen:

          [highlight=sql]create collation UNI_Phone
          for UTF8
          from UNICODE
          CASE INSENSITIVE
          ACCENT INSENSITIVE
          'ICU-VERSION=5.0 default'
          'locale=de@collation=phonebook'[/highlight]

          Dabei erhalte ich jedoch eine Fehlermeldung in Zeile 7:

          Invalid token.
          Dynamic SQL Error.
          SQL error code = -104.
          Token unknown - line 7, column 1.
          'locale=de@collation=phonebook'.

          Auch wenn ich locale ohne Hochkommata schreibe, löst Zeile 7 eine Fehlermeldung aus: Token unknown - line 7, column 1. Offenbar kennt Firebird den Befehl locale nicht, obwohl in der Language Reference für Firebird 2.5 genau dieser Locale-Befehl drinsteht, und zwar auf Seite 28. Nicht das, was nach locale folgt, wird angemeckert, sondern locale selbst. Wie soll ich das jetzt verstehen?
          Zuletzt editiert von Perlsau; 18.07.2016, 03:34.
          Die Tränen, die du nicht weinen willst, müssen andere für dich vergießen. (Frei nach: wer nicht leiden will, muß hassen.)

          Comment


          • #6
            Möglicherweise ist das ganze einfach Case-sensitiv? Muß also LOCALE heißen?

            So wie die Doku lese muss man die einzelnen Attribute auch einem Semikolon trennen.
            Zuletzt editiert von Ralf Jansen; 17.07.2016, 22:40.

            Comment


            • #7
              Leider erzeugt auch LOCALE dieselbe Fehlermeldung, mit und ohne Hochkommata.

              Nachtrag: Lasse ich die fehlerhafte Zeile komplett weg, erhalte ich folgende Fehlermeldung:

              This operation is not defined for system tables.
              unsuccessful metadata update.
              Invalid collation attributes.
              Zuletzt editiert von Perlsau; 17.07.2016, 22:57.
              Die Tränen, die du nicht weinen willst, müssen andere für dich vergießen. (Frei nach: wer nicht leiden will, muß hassen.)

              Comment


              • #8
                Das klingt dann nicht so als würden die Einstellungen, so wie von mir erhofft, einfach 1zu1 an die ICU dll weitergeleitet sondern zerlegt und irgendwo in den Systemtabellen abgelegt. Dann Bedarf es internes Firebird Wissen wie das geht. Zumindest mehr Wissen als in der Doku steht Vielleicht liefert die Mailingliste ja was.

                Comment


                • #9
                  Weiteres habe ich zwischenzeitlich herausgefunden: Einträge in der Datei fbintl.conf werden immer erst bei einem Neustart des Servers aktiviert. Ich habe jetzt beide Collations, die ich bereits erzeugt hatte, gelöscht und aus fbintl.conf ausgetragen, nachdem ich zuerst die Collations entfernt (drop collation) und dann den FB-Dienst beendet hatte. Danach ich ihn wieder gestartet. Nun habe ich eine neue Collation angelegt:

                  [highlight=sql]create collation UNI_VAR2
                  for UTF8
                  from UNICODE
                  CASE INSENSITIVE
                  'ICU-VERSION=5.0'[/highlight]
                  Diese Collation ist, nachdem ich den Dienst gestoppt, die Collation in die fbintl.conf eingetragen und danach den Dienst wieder gestartet habe, nun in IbExpert verfügbar. Man muß beim Erzeugen der Collation das default weglassen. Doch der Fehler mit dem Befehl locale kommt noch immer. Lasse ich dagegen die Zeile mit der ICU-Version weg, kann ich problemlos 'LOCALE=de_DE' angeben, das wird übernommen. Verwende ich dagegen den Befehl 'LOCALE=de@collation=phonebook', sagt mir der FB-Server, daß mit meinen Attributen was nicht stimmt: Invalid collation attributes.

                  Jetzt warte ich eben einfach mal ab, ob via Mailingliste eine Antwort kommt oder ob hier jemand ab morgen, wenn der Arbeitsalltag wieder beginnt, eine Antwort weiß.

                  Nachtrag:

                  In Delphi hab ich es jetzt mit den FireDac-Komponenten hinbekommen, daß in dieser Reihenfolge sortiert wird:

                  Aafabl
                  Aafael
                  Aafal
                  Aafäl
                  Aafb
                  Aafd
                  Aaff

                  Ich hab natürlich nicht alle Kombinationen überprüft, gehe aber davon aus, daß auch ö und ü richtig behandelt werden. Hinzugefügt hab ich im Programm folgendes vor dem Aktivieren des Queries:

                  [highlight=delphi]Query_Namen.FormatOptions.SortLocale := MAKELCID(MAKELANGID (LANG_GERMAN, SUBLANG_GERMAN), SORT_GERMAN_PHONE_BOOK);[/highlight]
                  Offenbar ist die Beschreibung in der Online-Hilfe mal wieder etwas fehlerhaft, denn dort wird das so dargestellt:

                  [highlight=delphi] // Set locale ID to German phone book collation
                  FDTable1.FormatOptions.SortLocale := MAKELCID(MAKELANGID (LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT);[/highlight]
                  Die Konstante SORT_GERMAN_PHONE_BOOK fand ich in der Unit System.Windows, nachdem ich dort nach SORT_DEFAULT gesucht habe. Den Hinweis mit der Windows-Unit lieferte die berühmt-berüchtigte F1-Taste.

                  Danke für deine Hilfe, Ralf Jansen, das hat mich um einiges weitergebracht.

                  Letztendlich suche ich aber nicht nur nach einer Möglichkeit, die gewünschte Sortierung im Client vornehmen zu können, sondern ebenfalls in der Datenbank, sprich: Ich benötige eine entsprechend sortierte Datenmenge auch für andere Clients, an denen ich nichts zu ändern vermag.
                  Zuletzt editiert von Perlsau; 18.07.2016, 21:04. Reason: Nachtrag
                  Die Tränen, die du nicht weinen willst, müssen andere für dich vergießen. (Frei nach: wer nicht leiden will, muß hassen.)

                  Comment


                  • #10
                    Originally posted by Perlsau View Post
                    In Delphi hab ich es jetzt mit den FireDac-Komponenten hinbekommen, daß in dieser Reihenfolge sortiert wird:

                    Aafabl
                    Aafael
                    Aafal
                    Aafäl
                    Aafb
                    Aafd
                    Aaff

                    Ich hab natürlich nicht alle Kombinationen überprüft, gehe aber davon aus, daß auch ö und ü richtig behandelt werden. Hinzugefügt hab ich im Programm folgendes vor dem Aktivieren des Queries:

                    [highlight=delphi]Query_Namen.FormatOptions.SortLocale := MAKELCID(MAKELANGID (LANG_GERMAN, SUBLANG_GERMAN), SORT_GERMAN_PHONE_BOOK);[/highlight]
                    Offenbar ist die Beschreibung in der Online-Hilfe mal wieder etwas fehlerhaft, denn dort wird das so dargestellt:

                    [highlight=delphi] // Set locale ID to German phone book collation
                    FDTable1.FormatOptions.SortLocale := MAKELCID(MAKELANGID (LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT);[/highlight]
                    Die Konstante SORT_GERMAN_PHONE_BOOK fand ich in der Unit System.Windows, nachdem ich dort nach SORT_DEFAULT gesucht habe. Den Hinweis mit der Windows-Unit lieferte die berühmt-berüchtigte F1-Taste.
                    Das war leider ebenfalls ein Irrtum, denn ich habe nun, nachdem ich weitere Strings in die Tabelle eingefügt habe, festgestellt, daß die Telefonbuch-Sortierung auch in diesem Fall nicht verwendet wird:

                    Aafabl
                    Aafadl
                    Aafael
                    Aafafl
                    Aafagl
                    Aafahl
                    Aafail
                    Aafal
                    Aafäl
                    Aafaml
                    Aafb
                    Aafd
                    Aaff

                    Gibt es hier irgend jemanden, dem es schon einmal irgendwie gelungen ist, die Telefonbuch-Sortierung hinzubekommen?
                    Die Tränen, die du nicht weinen willst, müssen andere für dich vergießen. (Frei nach: wer nicht leiden will, muß hassen.)

                    Comment

                    Working...
                    X