Willkommen bei Entwickler-Forum.
Ergebnis 1 bis 10 von 10
  1. #1
    Aufsteiger
    Registriert seit
    16.05.2009
    Ort
    Karlsruhe
    Beiträge
    61

    Standard 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?
    Geändert von Perlsau (18.07.2016 um 04:32 Uhr)
    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. #2
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.193

    Standard

    Zitat Zitat von Perlsau Beitrag anzeigen
    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

  3. #3
    Aufsteiger
    Registriert seit
    16.05.2009
    Ort
    Karlsruhe
    Beiträge
    61

    Standard

    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.)

  4. #4
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.775

    Standard

    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

  5. #5
    Aufsteiger
    Registriert seit
    16.05.2009
    Ort
    Karlsruhe
    Beiträge
    61

    Standard

    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:

    Code SQL:
    CREATE collation UNI_Phone
    FOR UTF8
    FROM UNICODE
    CASE INSENSITIVE
    ACCENT INSENSITIVE
    'ICU-VERSION=5.0 default'
    'locale=de@collation=phonebook'

    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?
    Geändert von Perlsau (18.07.2016 um 04:34 Uhr)
    Die Tränen, die du nicht weinen willst, müssen andere für dich vergießen. (Frei nach: wer nicht leiden will, muß hassen.)

  6. #6
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.775

    Standard

    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.
    Geändert von Ralf Jansen (17.07.2016 um 23:40 Uhr)

  7. #7
    Aufsteiger
    Registriert seit
    16.05.2009
    Ort
    Karlsruhe
    Beiträge
    61

    Standard

    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.
    Geändert von Perlsau (17.07.2016 um 23:57 Uhr)
    Die Tränen, die du nicht weinen willst, müssen andere für dich vergießen. (Frei nach: wer nicht leiden will, muß hassen.)

  8. #8
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.775

    Standard

    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.

  9. #9
    Aufsteiger
    Registriert seit
    16.05.2009
    Ort
    Karlsruhe
    Beiträge
    61

    Standard

    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:

    Code SQL:
    CREATE collation UNI_VAR2
    FOR UTF8
    FROM UNICODE
    CASE INSENSITIVE
    'ICU-VERSION=5.0'
    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:

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

    Code Delphi:
     // Set locale ID to German phone book collation
    FDTable1.FormatOptions.SortLocale := MAKELCID(MAKELANGID (LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT);
    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.
    Geändert von Perlsau (18.07.2016 um 22:04 Uhr) Grund: 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.)

  10. #10
    Aufsteiger
    Registriert seit
    16.05.2009
    Ort
    Karlsruhe
    Beiträge
    61

    Standard

    Zitat Zitat von Perlsau Beitrag anzeigen
    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:

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

    Code Delphi:
     // Set locale ID to German phone book collation
    FDTable1.FormatOptions.SortLocale := MAKELCID(MAKELANGID (LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT);
    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.)

 

 

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •