Matthias: Umlaute in MySQL sortieren

Hallo,

Ich lasse mir den Inhalt einer Tabelle sortieren:

... ORDER BY $feld1 ASC

In $feld1 sind allerdings Umlaute enthalten.

Dies führt dazu, dass beispielsweise "Öffentliches Recht"
entweder ganz am Ende bzw. in Falle von "Öffentliches Recht" ganz am Anfang der Liste steht.

Gibt es eine Möglichkeit, die Sortierung auch auf Umlaute korrekt anzuwenden? (Ich benutze PHP für die Abfrage)

Danke für Eure Hilfe,
Matthias

  1. Hi

    In $feld1 sind allerdings Umlaute enthalten.

    PHP kann Umlaute behandeln, das heisst bevor Du die Daten in die DAtenbank packst solltest du den String so konvertieren, dass er normale Umlaute enthält (also ö anstatt ö)
    da gibts es auch einen PHP befehl dafür,

    die funktionen htmlentities() oder htmlspecialcharakter könnten da hilfreich sein. Und dann genauso wieder zurückwandeln, wenn nötig

    Uli

    1. Hi

      In $feld1 sind allerdings Umlaute enthalten.
      PHP kann Umlaute behandeln, das heisst bevor Du die Daten in die DAtenbank packst solltest du den String so konvertieren, dass er normale Umlaute enthält (also ö anstatt ö)
      da gibts es auch einen PHP befehl dafür,

      die funktionen htmlentities() oder htmlspecialcharakter könnten da hilfreich sein. Und dann genauso wieder zurückwandeln, wenn nötig

      Uli

      Hallo zusammen.

      ich galube, der Aufwand ist unnötig. MySQL scheint eine sehr vernünftige Datenbank zu sein. Die hat nämlich einen "alternate collating key". Das bedeutet, dass beim Starten der DBE eine Ordinaltabelle für die Sortierung geladen wird.

      Ich suche das gerade. Kapitel 12. aber ich komme nicht rein in meine Datenbank. Der Server scheint down zu sein. Komme gleich wieder.

      Gruß

      Tom

      1. Hi,

        MySQL scheint eine sehr vernünftige Datenbank zu
        sein. Die hat nämlich einen "alternate collating
        key". Das bedeutet, dass beim Starten der DBE eine
        Ordinaltabelle für die Sortierung geladen wird.

        trotz Verwendung dieser Tabelle werden beim Sortieren
        aber immer noch Zeichen mit Zeichen verglichen und nicht
        Zeichen mit Strings (HTML-Entities).
        Um das Zurückwandeln der Entites kommst Du damit nicht
        herum.

        Viele Grüße
        <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael

        1. Hi,

          MySQL scheint eine sehr vernünftige Datenbank zu
          sein. Die hat nämlich einen "alternate collating
          key". Das bedeutet, dass beim Starten der DBE eine
          Ordinaltabelle für die Sortierung geladen wird.

          trotz Verwendung dieser Tabelle werden beim Sortieren
          aber immer noch Zeichen mit Zeichen verglichen und nicht
          Zeichen mit Strings (HTML-Entities).
          Um das Zurückwandeln der Entites kommst Du damit nicht
          herum.

          Ja, das Problem bleibt:
          eszet also ß
          plus steht vor minus
          ss
          Schreibweisen mit Bindestrich und ohne
          Bei Adresslisten hätte man ja gerne Str. und Strasse und Straße gleichwertig
          Groß-Kleinschreibung

          Das Problem kann man nur mit einem berechneten Matchcode lösen, der in einem extra Feld steht und dann erst unter Index gestellt wird.
          Ich hatte das Problem schon mal bei dr Postleitzahlumstellung. Das wurden Programme benötigt, die irgendwie wilde Straßenangaben in fremder Leute Datenbanken so auf den eigentlichen Informationsgehalt reduzieren, dass sie wieder sortierbar und erkennbar werden. Es hat geklappt.

          Gruß

          Tom

          1. Hi Tom,

            Ja, das Problem bleibt:
            eszet also ß
            plus steht vor minus

            nein, nichts von alledem. Das läßt sich alles über eine collating
            sequence lösen, sofern alle zu sortierenden Zeichen "gleich lang"
            sind.

            Aber sortiere mal "über" gegen "unter", _ohne_ die Entity vorher
            umzuwandeln (egal, in welchem Zeichensatz)! Da hilft keine Tabelle mehr.

            Viele Grüße
            <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael

            1. Hi Tom,

              Ja, das Problem bleibt:
              eszet also ß
              plus steht vor minus

              nein, nichts von alledem. Das läßt sich alles über eine collating
              sequence lösen, sofern alle zu sortierenden Zeichen "gleich lang"
              sind.

              Aber sortiere mal "über" gegen "unter", _ohne_ die Entity vorher
              umzuwandeln (egal, in welchem Zeichensatz)! Da hilft keine Tabelle mehr.

              Hai Michael,

              ja, das will ich nicht anweifeln, dass es da ein Problem gibt. Man müßte sich also eine Tabelle bauen (einbauen in MySQL) ind er für jedes Zeichen bzw. für jede Zeichenkombination, die man behandeln will, eine Funktion eingebaut ist. Schlußendlich muss alles wieder in einer Ordialtabelle enden. Dabei kann es passieren, dass man dan  acuh leicht auf die soundex()-Funktion stösst...

              Die ist nämlich so ähnlich aufgebaut.

              Für die Umwandlung von Sonderzeichen in HTML gibt es in PHP ja zum Glück die Funktion htmlentities(). Aber was ist mit der Rückwandlung. Die kommt zwar nur vor, wenn ich HTML-Seiten indizieren will, aber ich trotzdem keine Funktion gefunden.

              Wie ist das mit den anderen Sprachen?

              Bleibt einem wieder nix anderes übrig, als auf C runterzugehen, damit die Performance nicht in die Knie geht.

              Gruß

              Tom

    2. Hallo nochmal,

      bin eben schnell runtergeflitzt in die Bibliothek. Man gut, dass es noch Bücher gibt.

      Ich schreibe das mal ab:

      Wenn Sie eine andere Sortierordnung bevorzugen, müssen Sie die Option /default-character-set/ in der MySQL-Konfigurationsdatei ändern.

      Für jeden unterstützten Zeichensatz finden Sie im Verzeichnis mysql/share/charsets eine *conf-Datei. Falls MySQL dieses Verzeichnis nicht findet, müssen Sie dessen Ort mit der Option /character-set-dir/ angeben.

      Das fertige Set, dass Du brauchst ist "german1" Laut um Umlaut werden als gleichwertig behandelt, Die Upper89 und Lower() Funktionen funxen dann auch.

      Man kann die Tabellen auch selber umstricken. Ist aber ein bisschen kompliziert. Habe ich das letzte Mal vor 10 Jahren gemacht. Da hieß MySQL noch BTrieve.

      Gruß

      Tom

  2. Hallo Mathias,

    Dies führt dazu, dass beispielsweise "Öffentliches Recht"
    entweder ganz am Ende

    Du hast ein Locale-Problem ;-)
    Du solltest dir mal

    http://www.mysql.com/doc/G/e/German_character_set.html

    anschauen. MySQL mit '--default-character-set=latin_de' gestartet
    sollte die Woerter mit Umlauten richtig sortieren. Sollte dir diese
    Moeglichkeit nicht zur Verfuegung stehen, fuege eine weitere Spalte
    hinzu, in der du vor dem 'insert' alle Umlaute ersetzt durch ihr
    Pendant ('ö' beispielsweise wuerde zu 'oe', 'ü' wuerde zu 'ue').

    bzw. in Falle von "&Ouml;ffentliches Recht" ganz am Anfang der
    Liste steht.

    Also, mit HTML-Entities kann MySQL nicht umgehen. Ist auch nicht
    seine Aufgabe. Das ist deine und die des Browsers.

    Gruesse,
     CK