Ankündigung

Einklappen
Keine Ankündigung bisher.

mySQL ORDER BY mit Umlauten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • mySQL ORDER BY mit Umlauten

    Wenn man auf meiner Seite bei der Auswahl 'Suche' die Kategorie 'Land' auswählt und dort nach 'Deutschland' sucht erfolgt eine Auflistung der Filme die mindestens einen Drehort in Deutschland hatten. So weit do gut...

    Wenn man nun bis ans Ende scrollt erscheint dort der Film "Zweiohrküken" und DANACH "Zärtliche Chaoten II" wobei Zä* eigentlich von Zw* kommen sollte.

    Wenn man nun unter 'Alphabet' den Buchstaben 'Z' auswählt ist die Ergebnisliste aber korrekt sortiert ???

    sql-Befehl bei Alphabet:

    PHP-Code:
    $sql 'SELECT * FROM `movie` WHERE `titel` LIKE '.$letter

    sql-Befehl bei der Suche:

    PHP-Code:
    $search 'SELECT * FROM `movie` WHERE `titel` LIKE '.$smovie.' ORDER BY `titel`'

    Kollation in der Datenbank ist überall auf 'utf8mb4_general_ci' gesetzt. Nach Recherche im Internet soll da das Problem liegen.
    Wenn man den sql-Befehl um ein 'COLLATE' mit der Kollation 'latin1_german2_ci' erweitert soll die Sortierung passen.

    PHP-Code:
     $search 'SELECT * FROM `movie` WHERE `titel` LIKE '.$smovie.' ORDER BY `titel` COLLATE latin1_german2_ci'
    Ergebnis: Nichts. Weder Fehlermeldung noch eine korrekte Sortierung :-(

    Bisher gefundene "Lösungen":

    - in der Datenbank eine parallele Spalte führen ohne Umlaute und bei ORDER BY dann diese aufrufen (sehr redundant) :-(
    - Die Inhalte des Arrays mittels einer Funktion "umlautfrei" codieren, sortieren und zurückwandeln auf Umlaute (Wandelt auch zufällig beieinanderliegende ae/oe.. um, z.B. wäre Zooeingang dann Zoöingang) - auch doof :-(

    Versuch unter php das Array 'umlautkonform' zu sortieren:

    PHP-Code:
        setlocale (LC_COLLATE'de_DE');
        
    usort($array'strcoll'); 
    Ergebnis: Nichts, weiterhin werden Umlaute bei Sortierung falsch behandelt.

    Ich will echt nicht glauben dass es 2021 keine probate Methode gibt Umlaute zu sortieren ???
    ________
    Megabyte66
    ________

  • #2
    Bei mir hat die .my.cnf Methode funktioniert.

    https://stackoverflow.com/questions/...sql-phpmyadmin
    https://arnego2.com <Webseiten, Umbau ab €80, Serverumzug ab €50>

    VPS 8GB RAM 50 GB ROM < Server in der EU, 1rstes Jahr €38

    Kommentar


    • #3
      Hallo arnego2

      Danke für die Rückmeldung, aber hilft hier nicht :-)

      Ich habe keinerlei Probleme mit der Darstellung von Umlauten. Alle Umlaute werden sowohl in phpMyAdmin als auch im Frontend exakt dargestellt. Dafür wurde mittels diversen utf-8 Direktiven gesorgt. Keine Probleme...

      Probleme macht die alphabetische Sortierung einer Datenbankabfrage. Sortierung nach utf-8 bedeutet, dass Umlaute die hintere Plätze bekommen (als Bespiel: Zw* erscheint in der Sortierung vor Zü* obwohl nach deutscher Sortierung das ü vor w kommen müsste. Und hierfür suche ich noch nach einer Lösung nachdem die oben beschriebenen Methoden nicht zum Ziel führten :-(
      ________
      Megabyte66
      ________

      Kommentar


      • #4
        Wenn es nicht gerade hunderttausende von Datensätzen sind würde ich auf eine Sortierung mit PHP und einem Callback setzen, also usort. Dann kannst Du in der Vergleichsfunktion die Strings in eine Form bringen, die für den Vergleich geeignet ist und brauchst diese nirgends zu speichern, also die Redundanz bleibt dir erspart. Auch eine Rückkonvertierung entfällt. Nachteil: Für den selben Eintrag wird die Funktion wahrscheinlich mehrfach aufgerufen, so dass auch die Konvertierung mehrfach erfolgen würde.
        Alternativ im Vorlauf die konvertierte Form des Begriffs den Datensätzen im Array hinzu fügen. Nach dem Sortieren wenn Du die Ausgabe generierst, kannst Du diese ja ignorieren.
        Mal gespannt, was die Datenbankspezialisten zu diesem Problem sagen werden.

        Kommentar


        • #5
          Hallo Sempervivum

          Danke für deinen Beitrag. Das wäre sicherlich ein begehbarer Weg. Fühlt sich aber immer noch irgendwie an wie "durch den Rücken in die Brust geschossen". Aber scheinbar lässt sich diese Aufgabe nicht mit einer einzigen Direktive elegant lösen. Wenn es daher keine solche Direktive gibt bleibt mir wohl nichts anderes übrig als einen "Bypass" zu programmieren :-(.

          Bin aber immer noch ungläubig dass es für diese Aufgabestellung keinen standardisierten anwendbaren Aufruf gibt... Vielleicht kommt ja noch eine glorreiche Idee :-)
          ________
          Megabyte66
          ________

          Kommentar


          • #6
            Wenn das alles so klappt warum ist dir die Ordnung so wichtig?
            https://arnego2.com <Webseiten, Umbau ab €80, Serverumzug ab €50>

            VPS 8GB RAM 50 GB ROM < Server in der EU, 1rstes Jahr €38

            Kommentar


            • #7
              'Alles klappt' bezieht sich auf die Darstellung und Speicherung von Umlauten. Das passt.

              Aber eine alphabetische Auflistung wie:

              Zweiohrküken
              Zärtliche Chaoten

              Ist nicht wirklich schön und stört mich auf meiner Seite. Wenn jemand 'Zärtliche Chaoten' sucht scrollt er wohl Za* evtl. bis Ze* durch. Dann kommt wohl die (falsche) Erkenntnis auf, dass 'Zärtliche Chaoten' nicht im Sortiment sind, weil sie sonst ja bei Za* irgendwo erscheinen hätten müssen.

              Dass der Suchtreffer dann trotz 'ae' an zweiter Stelle erst als letztes gelistet wird ist imho ein Mangel den ich gerne 'elegant' bereinigen möchte :-)
              ________
              Megabyte66
              ________

              Kommentar


              • #8
                Hi,
                Du hast wohl nur die Wahl, eine Sortierfunktion zu nutzen oder die Daten als "Zaertliche Chaoten" speichern.

                Gruß
                Ingo
                Ingo Webdesign

                Kommentar


                • #9
                  Zitat von Megabyte Beitrag anzeigen
                  'Alles klappt' bezieht sich auf die Darstellung und Speicherung von Umlauten. Das passt.

                  Aber eine alphabetische Auflistung wie:

                  Zweiohrküken
                  Zärtliche Chaoten

                  Ist nicht wirklich schön und stört mich auf meiner Seite.
                  Ist das hier deine Lösung: https://www.php-resource.de/forum/sq...ch-ordnen.html
                  ist von 2004 von daher könnte es schon veraltet sein.

                  oder Tipps dazu: https://www.nickles.de/forum/homepag...538660296.html
                  https://arnego2.com <Webseiten, Umbau ab €80, Serverumzug ab €50>

                  VPS 8GB RAM 50 GB ROM < Server in der EU, 1rstes Jahr €38

                  Kommentar


                  • #10
                    arnego2

                    Danke, aber dahinter war leider auch kein Lösungsansatz :-(. Beim ersten Link wird die myQSL Sortieroption 'ORDER BY' als Tipp gegeben. Das wende ich ja auch an und er sortiert auch (fast) richtig. Bis auf Umlaute - die packt er immer ans Ende (was vom Prinzip logisch ist da es im ASCII numerisch hinter den klassischen Buchstaben auftaucht)

                    Bei zweiten Link geht es erneut um Darstellungsprobleme von Umlauten. Die habe ich ja nicht.

                    @ingo

                    Ja leider. Sehe ich mittlerweile auch so. Entweder Mehraufwand mit einer Bypass-Sortierung oder der 'Pferdefuß' einer 'Kreuzworträtsel-Lösung'. Da mir letzteres nicht gefällt werde ich mir wohl etwas basteln müssen.

                    Werde wohl in der Datenbank eine zusätzliche Spalte anlegen (z.B. 'title_sort') und bei der Eingabe der Daten eine Subroutine aufrufen die dann Umlaute in 'ae', 'ue' etc. wandelt und dieses Ergebnis dann in diese Spalte ergänzt. Danach das ORDER BY auf diese Spalte legen. Scheint mir noch am elegantesten da automatisch gewandelt und abgelegt wird. Denke wenn die Routine mal steht könnte man damit leben :-)

                    Bin aber immer noch perplex dass es 2021 hier kein Befehl/Argument weder in SQL noch in php gibt. Erstaunlicherweise kommt JavaScript damit recht gut klar (w1.localeCompare (w2, "de"). Wegen evtl. deaktiviertem JavaScript wollte ich den Weg nicht gehen. Vielleicht doch :-)...
                    ________
                    Megabyte66
                    ________

                    Kommentar


                    • #11
                      Megabyte Du hast die Ursache für dein Problem schon im ersten Posting genannt. Du hast die Kollation utf8mb4_general_ci und versuchst diese per latin1_german2_ci zu sortieren. Bei solchen Arbeiten ist es besonders wichtig immer auf die identische Kollation und Charsets zu achten. Ebenso muss man aber auch eine möglichst aktuelle MySQL/MariaDB-Version im Einsatz haben.

                      Schau dir mal https://mixable.blog/mysql-order-by-...tsche-umlaute/ an. Ich habe das gerade bei mir mal nachgestellt mit folgender Tabelle:

                      Code:
                      create table movie ( titel varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
                      Darin dann die Inhalte wie unter dem Link genannt. Anschließend kann ich per

                      Code:
                      SELECT * FROM movie ORDER BY titel COLLATE utf8mb4_general_ci
                      problemlos nach Alphabet inkl. den Umlauten sortieren.

                      Wenn das bei dir nicht geht, hast Du entweder eine veraltete MySQL/MariaDB-Version im Einsatz oder einen Fehler in den Einstellungen des Datenbanksystems.

                      EDIT: auch hilfreiche Infos zu den zu wählenden Zeichensätzen: https://www.econcess.de/blog/11-webd...nder-kollation

                      Kommentar

                      homepage-forum.de - Hilfe für Webmaster! Statistiken

                      Einklappen

                      Themen: 56.938   Beiträge: 431.246   Mitglieder: 28.751   Aktive Mitglieder: 80
                      Willkommen an unser neuestes Mitglied, Handyreparatur Berlin.

                      Online-Benutzer

                      Einklappen

                      275 Benutzer sind jetzt online. Registrierte Benutzer: 2, Gäste: 273.

                      Mit 3.502 Benutzern waren am 23.01.2020 um 17:20 die meisten Benutzer gleichzeitig online.

                      Die neuesten Themen

                      Einklappen

                      Die neuesten Beiträge

                      Einklappen

                      Lädt...
                      X