Martin Dunst: MySQL 5.0: Sonderbuchstaben/Umlaute transformieren

Hallo,

Meines Wissens vergleicht der LIKE-Operator in MySQL ja so, dass ein 'ä' einem 'a' entspricht, ein 'é' einem 'e' usw.
SELECT 'e' LIKE 'é' liefert dem entsprechend '1' als Ergebnis.
Bietet MySQL eine Methode, einen String so umzuwandeln, dass alle "Sonderbuchstaben" in ihren "Stammbuchstaben" umgewandelt werden?

z.B.
'Müller' -> 'Muller'
'lyžařské' -> 'lyzarske'

Meine Frage bezieht sich konkret auf MySQL 5.0.x, (Charset utf8, Kollation utf8_general_ci)

lg
Martin Dunst

--
Do what I say, not what I do.
--Tim Berners-Lee
  1. Hi,

    Meines Wissens vergleicht der LIKE-Operator in MySQL ja so, dass ein 'ä' einem 'a' entspricht, ein 'é' einem 'e' usw.

    Das kommt auf die verwendete Collation - die bestimmt die Sortier-/Vergleichsvorschriften.

    Bietet MySQL eine Methode, einen String so umzuwandeln, dass alle "Sonderbuchstaben" in ihren "Stammbuchstaben" umgewandelt werden?

    z.B.
    'Müller' -> 'Muller'
    'lyžařské' -> 'lyzarske'

    Zu welchem Zweck?

    MfG ChrisB

    1. Hallo,

      Das kommt auf die verwendete Collation - die bestimmt die Sortier-/Vergleichsvorschriften.

      Die Kollation der betreffenden Datenbank ist utf8_general_ci.
      Die speziellen Anforderungen der deutschen Umlaute ('ä'=='ae' etc.) können vernachlässigt werden, wichtig wäre mir aber z.B. 'à'=='a', 'â'=='a' etc.

      Bietet MySQL eine Methode, einen String so umzuwandeln, dass alle "Sonderbuchstaben" in ihren "Stammbuchstaben" umgewandelt werden?

      Zu welchem Zweck?

      Als Teil der automatischen Generierung eines Benutzernamens auf Basis eines Nachnamens.

      lg
      Martin Dunst

      --
      Do what I say, not what I do.
      --Tim Berners-Lee
      1. Hi,

        Als Teil der automatischen Generierung eines Benutzernamens auf Basis eines Nachnamens.

        Hm, das wuerde ich lieber vorgelagert schon machen, und nicht erst in MySQL.

        Ausserdem musst du ja beispielsweise reagieren, wenn mehrere Personen mit dem gleichen Nachnamen sich registrieren wollen, oder mehrere Nachnamen mit Sonderzeichen einen gleichen "normalisierten" Nutzernamen ergeben wuerden.

        MfG ChrisB

        1. Hallo,

          Hm, das wuerde ich lieber vorgelagert schon machen, und nicht erst in MySQL.

          Das sehe ich anders:
          MySQL kann offenbar genau das, was ich brauche.
          Beispiel: SELECT 'lyžařské' LIKE 'lyzarske'; liefert '1'.
          Das Rad müsste für diesen Zweck also nicht neu erfunden werden.

          Ausserdem musst du ja beispielsweise reagieren, wenn mehrere Personen mit dem gleichen Nachnamen sich registrieren wollen, oder mehrere Nachnamen mit Sonderzeichen einen gleichen "normalisierten" Nutzernamen ergeben wuerden.

          Dafür ist gesorgt.
          MySQL soll nur die _Basis_ des Benutzernamens generieren, z.B. mit einem Query der Form
          SELECT GesuchteFunktion('lyžařské') AS loginbase;

          lg
          Martin Dunst

          --
          Do what I say, not what I do.
          --Tim Berners-Lee
  2. echo $begrüßung;

    Meines Wissens vergleicht der LIKE-Operator in MySQL ja so, dass ein 'ä' einem 'a' entspricht, ein 'é' einem 'e' usw.

    Der LIKE-Operator vergleicht wie alle String-Funktionen abhängig von der gewählten Kollation. Wenn du eine case-sensitive Kollation verwendest, dann vergleicht er nicht so. Wenn du Schwedisch verwendetest wäre beispielsweise U=Y.

    Bietet MySQL eine Methode, einen String so umzuwandeln, dass alle "Sonderbuchstaben" in ihren "Stammbuchstaben" umgewandelt werden?

    Hast du in der Funktionsübersicht eine gefunden? Hat dir das Kapitel Internationalization and Localization eine Antwort geben können? Das wären die Stellen, an denen ich jetzt für dich auf Suche gehen tät, denn mir ist eine solche Funktion nicht bekannt.

    echo "$verabschiedung $name";

    1. Hallo,

      Hast du in der Funktionsübersicht eine gefunden? Hat dir das Kapitel Internationalization and Localization eine Antwort geben können? Das wären die Stellen, an denen ich jetzt für dich auf Suche gehen tät, denn mir ist eine solche Funktion nicht bekannt.

      Leider nicht.
      Die naheliegendste Lösung wäre für mich folgende:
      SELECT CONVERT('lyžařské' USING ascii);
      Buchstaben, die um diakritische Zeichen erweitert sind, gehen damit jedoch verloren.
      Das Ergebnis ist 'ly?a?sk?'.

      lg
      Martin Dunst

      --
      Do what I say, not what I do.
      --Tim Berners-Lee