Harald Breitkreutz: MySQL, Sonderzeichen und group by

Holladiewaldfee,

in einer MySQL 5-Datenbank befinden sich diverse Datensätze, wild gespickt mit Sonderzeichen aus allen möglichen und unmöglichen europäischen Sprachen. Ein GROUP BY soll dabei die vorhandenen Anfangsbuchstaben ermitteln, geknüpft an diverse Bedingungen, so daß der Spaß mit DISTINCT/SUBSTRING/ORDER-Konstruktionen nicht mehr ordentlich lösbar ist. Als Zeichensatz für die Tabelle ist latin1_german1_ci angegeben, alle Sonderzeichen stehen korrekt in der Datenbank und kommen auch ordentlich wieder raus.

Das Problem ist nun, daß GROUP BY die nicht gänzlich von der Hand zu weisende Logik vertritt, es gelte in so einem Fall Å=A=Ä=Á usw. Das ist zwar nett gemeint, hilft mir aber keinen Strich weiter, weil ich die einzelnen Zeichen getrennt brauche. Wie kann ich MySQL also beibiegen, solche Sonderzeichen bei GROUP BY nicht mit den entsprechenden Vokalen in einen Topf zu matschen?

Ciao,

Harry
 (In der irrigen Hoffnung, daß es a) überhaupt geht und dann auch noch b) ohne MySQL neu kompilieren oder c) in der my.ini rumpfuschen zu müssen)

  1. yo,

    Das Problem ist nun, daß GROUP BY die nicht gänzlich von der Hand zu weisende Logik vertritt, es gelte in so einem Fall Å=A=Ä=Á usw.

    wenn mehrere sprachen in einer tabelle gespeichert werden, dann hat diese tabelle in aller regel auch eine zusätzliche spalte für die jeweilige verwendetete spalte. falls so eine spalte bei dir vorhanden sein sollte, kannst du sie mit in die GROUP BY klausel mit aufnahmen, sprich du gruppierst nicht nur nach dem anfangsbuchstaben, sondern zusätzlich auch nach der länderkennung. dann sollte er auch die buchstaben unterscheiden und nicht zusammenfassen.

    Ilja

    1. Holladiewaldfee,

      wenn mehrere sprachen in einer tabelle gespeichert werden, dann hat diese tabelle in aller regel auch eine zusätzliche spalte für die jeweilige verwendetete spalte.

      nein, da liegt ein Mißverständnis vor. Konkret sind in der Tabelle Namen von Bergen und Hütten aus der ganzen Welt gespeichert. Die stehen alle unabhängig von der Sprache, der die Namen entstammen (die ich auch nicht unterscheiden kann), in einer Spalte "bergname". Die Aufgabe ist es nun, für einen beliebigen übergebenen String festzustellen, ob sich die Namen die mit dieser Zeichenfolge beginnen gruppieren lassen. Bedingung für eine Gruppierung ist, daß das dem Substring nachfolgende Zeichen in mindestens X Bergnamen an dieser Stelle auftritt.

      Beispiel:
      x=2
      übergebener Substring: "zugs"

      Inhalt der Tabelle:

      zugspitze
      zugspitzgipfel
      zugsälälä
      zugsalala
      zugsblau

      Die Query sollte in diesem Fall "p" zurückgeben.

      Momentane Lösung:
      SELECT COUNT(bergname) AS cnt,
             SUBSTRING(bergname, 5, 1) AS subs
      FROM tabellexyz
      WHERE SUBSTRING(bergname, 1, 4)="zugs"
      GROUPY BY subs
      HAVING cnt>2
      ORDER BY subs ASC

      Sie liefert aber in diesem Fall "ä" und "p" zurück. Was freilich grottig ist, weil ich "ä" und "a" eben getrennt haben möchte.

      Interessanterweise gilt auch bei einem SELECT über einen Substring etwas in der Art "Ä"="A", also dürfte es sich wohl generell um ein Zeichensatzproblem handeln. Ich wechsle auch gern den Zeichensatz der Tabelle, kein Problem, allerdings müsste ich dann halt wissen, mit welchem der vielen Zeichensätze das Problem nicht auftritt.

      Ciao & Danke,

      Harry

  2. echo $begrüßung;

    in einer MySQL 5-Datenbank befinden sich diverse Datensätze, [...] Als Zeichensatz für die Tabelle ist latin1_german1_ci angegeben, [...]

    Das Problem ist nun, daß GROUP BY die nicht gänzlich von der Hand zu weisende Logik vertritt, es gelte in so einem Fall Å=A=Ä=Á usw. [...] Wie kann ich MySQL also beibiegen, solche Sonderzeichen bei GROUP BY nicht mit den entsprechenden Vokalen in einen Topf zu matschen?

    Kennst du das sehr umfangreiche Kapitel Charachter Set Support zu diesem sehr umfangreichen Thema?

    Ich könnte mir vorstellen, dass die Collation "binary" dir bei deinem Problem behilflich sein könnte.

    echo "$verabschiedung $name";

    1. echo $begrüßung;

      Ich könnte mir vorstellen, dass die Collation "binary" dir bei deinem Problem behilflich sein könnte.

      Nachtrag: Außerdem könnte schon das Einfügen des Operators BINARY vor dem Spaltennamen helfen.

      echo "$verabschiedung $name";

      1. Holladiewaldfee,

        Nachtrag: Außerdem könnte schon das Einfügen des Operators BINARY vor dem Spaltennamen helfen.

        Ja, vielen Dank, das schaut sehr gut aus :-)

        Ciao,

        Harry

        --
          Irgendwann kommt die Waldfee - oder auch nicht ... (Projektphase: Keine Ahnung)
          Bis dahin:
          Ski- und Bergtouren in den Tölzer Voralpen und im Karwendel